使用realloc()时为什么会出现分段错误?

时间:2014-11-29 09:37:59

标签: c segmentation-fault realloc

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

我还想问一下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;



}

3 个答案:

答案 0 :(得分:2)

您忘记将内存分配给char** inputStrings;

要解决,

  1. 将内存分配给inputStringsinputStrings[i]。 [malloc() / calloc()]
  2. ,或者

    1. inputStrings之前将内存分配到inputStrings[i]并将NULL设置为realloc()
    2. 检查realloc()的{​​{3}}。

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


      编辑:

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

      也是错误的概念。您必须单独为inputStringsinputStrings[i]分配内存。请查看man page以获取相关帮助。

答案 1 :(得分:2)

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

inputstring = malloc(sizeof(char*));

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

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

之后只有你能够使用realloc重新分配内存。

答案 2 :(得分:0)

修复示例

#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;
}