【问题标题】:Why am I getting a segmentation fault when using realloc()?为什么在使用 realloc() 时会出现分段错误?
【发布时间】:2015-01-27 19:58:37
【问题描述】:

这个小测试程序正在从命令行读取字符串,我遇到了一个段错误。谁能帮我?

我也想问一下realloc()malloc()有什么不同?我的意思是我认为realloc() 更聪明,那么为什么我们还需要malloc()?对于malloc(),我知道我们必须将字符串和malloc() 复制到新内存中,但是谁能给我一个例子?

#include <stdio.h>
#include <stdlib.h>


//reading the string from the command line
int
main(int argc, char *argv[]){
  char** inputStrings;


  int i;
  for(i=1;i<argc;i++){
    inputStrings=realloc(*inputStrings,i*sizeof(argv[i]));

    inputStrings[i-1]=argv[i];

  }
  for(i=0;i<argc-1;i++){

    printf("what is in the address: %s\n",inputStrings[i]);
  }

  free(inputStrings);
  return 0;



}

【问题讨论】:

  • 每个问题一个问题。第一个回答。对于其他人,请阅读相应的手册页。

标签: c segmentation-fault realloc


【解决方案1】:

你忘了给char** inputStrings;分配内存

解决,

  1. 分配内存给inputStringsinputStrings[i]。 [malloc()/ calloc()]

或者,

  1. 将内存分配给inputStrings,并在realloc()之前将inputStrings[i]设置为NULL

检查man pagerealloc()

注意:请学习使用调试器,例如gdb确实可以查明上述错误。


编辑:

inputStrings=realloc(*inputStrings,i*sizeof(argv[i]));

也是错误的概念。您必须分别为inputStringsinputStrings[i] 分配内存。请查看this answer 以获得有关此方面的帮助。

【讨论】:

  • 只是补充一点,即使这样,OP 代码 inputStrings=realloc(*inputStrings,i*sizeof(argv[i])); 中的分配类型也没有意义,因此也需要修复
  • @Gopi 对。更新中。
【解决方案2】:

您应该为char** inputString 分配内存。首先使用malloccalloc

inputstring = malloc(sizeof(char*));

那么你应该在循环中为每个位置分配内存

inputString[i] = malloc(sizeof(char));

之后,只有您可以使用 realloc 重新分配内存。

【讨论】:

    【解决方案3】:

    固定示例

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[]){
        char **inputStrings = NULL;
    
        int i;
        for(i=1; i<argc; i++){
            inputStrings=realloc(inputStrings, i*sizeof(argv[i]));//check omitted
            inputStrings[i-1]=argv[i];
        }
        for(i=0;i<argc-1;i++){
            printf("what is in the address: %s\n", inputStrings[i]);
        }
        free(inputStrings);
        return 0;
    }
    

    【讨论】:

    • realloc 不是每个元素都需要的,因为需要的大小由argc 提前看到。
    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 2011-04-23
    相关资源
    最近更新 更多