重新分配内存在 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 stringn");
    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 allocatingn");
                exit(1);
            }
            else
                free(p);
        }
        c=getchar();
        p[i]=c;
        i++;
    }
    char h [sizeof(p)];
    copyStr(p,h);
}

我发现 realloc 功能不起作用,所以我正在寻求您的帮助。

如果输入非常短(即 3 个字符),程序将起作用。如果长度超过 10 个字母,则不会重新分配内存。如果它超过 5,它将反转打印,但会向我发送一条名为"堆栈粉碎"的消息。谢谢。

其实有一些

小技巧可以改变:

  • *temp=realloc(...应该变得temp=realloc(...
  • temp!=NULLrealloc()的正常行为。
  • 如果您在之后使用它,请不要忘记在 realloc 操作后更改p
  • sizeof(p)是指针的大小,即 4 或 8...我把它变成了char h [sizeof(char)*(i+1)];
  • 我还在字符串末尾添加了字符。如果您希望打印它或使用 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]='';
    /* 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 stringn");
    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]='';
    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 allocatingn");
                exit(1);
            }
            else{
                p=temp;
                printf("ok heren");
            }
        }
        c=getchar();
        p[i]=c;
        i++;
    }
    //signaling end of string 
    p[i+1]='';
    printf("INVERTING STRINGn");
    char h [sizeof(char)*(i+1)];
    copyStr(p,h);
           free(p);
}

! enif krow ot smees ti

再见

弗朗西斯

它不是*temp它的temp。Realloc 返回分配内存的位置的地址,您应该将其存储在指针中。没有存储在指针已经指向的地址中,这毫无意义

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

要成为

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

指针是temp*temp指内容。

相关内容

  • 没有找到相关文章