перераспределение памяти не работает в c

Что я пытаюсь сделать в своей программе, так это скопировать содержимое одной строки в другую в обратном порядке. Эта часть программы работает.

Однако я не хочу ограничивать пользователя для ввода, поэтому я хочу использовать malloc и realloc. Это мой код:

#include <stdio.h>
#include <stdlib.h>
/*copy one string to another, in reverse*/
void copyStr(char *p, char *h){

   int i=0,j=0;
   int length=0;
   length=strlen(p); int l=length;
   for (i=0; i<length; i++){
       h[i]=p[l-1];
       l--;
   }
   char *temp=&h[0];
   for (i=0; i<length; i++){
       printf("%c",temp[i]);
   }


}
main(){
    printf("please enter a string\n");
    char c; int i=0; int end=10;
    /*allocate initial memory*/
    char *p=(char*)malloc(sizeof(end)); char *temp=p;
    while (c!='\n')
    {
        /*reallocate if needed*/
        if (i==(end-1)){
            end*=2;
             temp = realloc(p,end*sizeof(temp));
            if (temp!=NULL){
                /*this is for myself, to see what the error was*/
                printf("error allocating\n");
                exit(1);
            }
            else
                free(p);
        }
        c=getchar();
        p[i]=c;
        i++;
    }

    char h [sizeof(p)];
    copyStr(p,h);
}

Я обнаружил, что функция realloc не работает, поэтому прошу вашей помощи.

Программа работает, если ввод очень короткий (т.е. 3 символа). Если он длиннее 10 букв, он не будет перераспределять память. Если он длиннее 5, он будет печатать в обратном порядке, но отправит мне сообщение под названием «стек разбит». Спасибо.


person Assaf    schedule 15.02.2014    source источник
comment
Возможно, temp=(char*)realloc(p,end*sizeof(temp)); сработает... Потому что *temp=(char*)realloc(p,end*sizeof(temp)); кажется странным.   -  person francis    schedule 15.02.2014
comment
пробовал оба, все равно не работает...   -  person Assaf    schedule 15.02.2014


Ответы (3)


На самом деле, есть несколько маленьких хитростей, чтобы изменить:

  • *temp=realloc(... должно стать temp=realloc(...
  • Тот факт, что temp!=NULL является нормальным поведением realloc().
  • не забудьте изменить p после операции realloc, если вы используете ее после.
  • sizeof(p) - это размер указателя, то есть 4 или 8... Я превратил его в char h [sizeof(char)*(i+1)];
  • я также добавил символ \0 в конце строки. Это полезно, если вы хотите распечатать его или использовать strlen() и #include string.h. Тогда вы можете printf("the result is :\n%s \n",h);

Вот код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*copy one string to another, in reverse*/
void copyStr(char *p, char *h){

    int i=0,j=0;
    int length=0;
    length=strlen(p); int l=length;
    for (i=0; i<length; i++){
        h[i]=p[l-1];
        l--;
    }
    //keep end-of-string character
    h[length+1]='\0';
    /* char *temp=&h[0];
   for (i=0; i<length; i++){
       printf("%c",temp[i]);
   }*/
    printf("the result is :\n%s \n",h);



}
main(){
    printf("please enter a string\n");
    char c; int i=0; int end=10;
    /*allocate initial memory*/
    char *p=(char*)malloc(sizeof(end)); char *temp=p;
    //signaling end of string
    p[0]='\0';
    while (c!='\n' && c!=EOF)
    {
        /*reallocate if needed*/
        if (i==(end-2)){
            end*=2;
            temp=(char*)realloc(p,end*sizeof(char));
            if (temp==NULL){
                /*this is for myself, to see what the error was*/
                printf("error allocating\n");
                exit(1);
            }
            else{
                p=temp;
                printf("ok here\n");
            }
        }
        c=getchar();
        p[i]=c;
        i++;
    }
    //signaling end of string 
    p[i+1]='\0';

    printf("INVERTING STRING\n");
    char h [sizeof(char)*(i+1)];
    copyStr(p,h);

           free(p);
}

! enif krow ot smees ti

До свидания,

Фрэнсис

person francis    schedule 15.02.2014
comment
есть два факта: 1. ВАШ КОД РАБОТАЕТ. 2. Я должен узнать, как это работает. Спасибо! - person Assaf; 15.02.2014
comment
Я добавил free(p) в конце... чтобы избежать будущих утечек памяти... Пока, Фрэнсис - person francis; 15.02.2014

Это не *temp, это temp. Realloc возвращает адрес места, где выделена память, которую вы должны сохранить в указателе. не сохранять по адресу, указанному указателем, что уже не имеет смысла

person KARTHIK BHAT    schedule 15.02.2014

*temp=(char*)realloc(p,end*sizeof(temp));

to be

temp = realloc(p,end*sizeof(temp));

Указатель temp, *temp относится к содержимому.

person Sakthi Kumar    schedule 15.02.2014