0
  char *str=NULL;
  strsave(s,str,n+1);
  printf("%s",str-n);

当我 gdb 调试此代码时,我发现 str 值为 0x0,它为空,而且我的代码没有捕获这个失败的内存分配,它不执行 str==NULL perror 代码...任何想法

 void strsave(char *s,char *str,int n)
 {
    str=(char *)malloc(sizeof(char)* n);
            if(str==NULL)
                    perror("failed to allocate memory");
    while(*s)
    {
            *str++=*s++;
    }
            *str='\0';
 }
4

2 回答 2

4

您的代码的问题是您将分配内存的指针分配str. str函数内部是一个局部变量,它位于与调用期间传递给的变量不同的内存地址strsave

为了更改str指向的位置,您需要将指针传递给指向 char 的指针以解决此问题。

void strsave(char *s,char **str,int n)

另一种选择是返回一个指向新分配的字符串的指针。

但是,最好的解决方案是在调用之前分配内存strsave并将有效指针传递给strsave. 当同一模块/层或函数同时负责特定资源的分配和解除分配时,更容易跟踪内存分配。

于 2012-11-03T11:02:09.777 回答
0

听说过 C 中按值传递的参数吗?如果没有 - 你应该。

无论如何,分配内存而不将其指针分配给变量(或分配然后“泄漏”,如您的情况) - 严格来说不是错误。是的,这不是一个好习惯,它是资源/内存泄漏。但在某些情况下,这可能是程序员真正想要的。

从编译器的角度来看,调用函数而不将其返回值分配给变量是可以的。

于 2012-11-03T11:29:43.327 回答