c中指针的内存分配

时间:2013-01-10 09:45:10

标签: c segmentation-fault malloc

我有一个数组如下:

 char* arg[1024];

现在初始化arg,我将传递给一个函数,我正在执行以下操作:

 arg = (char**)calloc(1024,sizeof(char*)); 

但是每当我将arg传递给函数时。我最终得到了一个分段错误。该函数基本上是对字解析执行一些非常简单的命令:

 void parse(char* buffer, char** arg)
 {
   while(*buffer!='\0')
   {
     *arg=buffer;
      arg++;
      while(*buffer!=' ')
      buffer++;

      while(*buffer == ' ')
      {
         *buffer = '\0';
          buffer++;
      }         

   }
 }

我在内存分配方面做错了吗?或传递指针?

3 个答案:

答案 0 :(得分:4)

char* arg[1024];

提供了一个静态分配的1024个char指针数组。您不需要再次动态分配它。请删除calloc()行。

除了你的分配问题,还有另一个错误。看看:

while(*buffer != ' ')
    buffer++;

如果buffer = "test"会怎样?您的while - 循环将找不到空格并继续在buffer之外迭代。导致各种未定义的行为...

要解决此问题,您还需要检查字符串终止符:

while(*buffer != 0 && *buffer != ' ')
    buffer++;

答案 1 :(得分:1)

char* arg[1024]; char指针的数组。

arg = (char**)calloc(1024,sizeof(char*));错了。我们无法将新分配的内存地址分配给arg

如果你想创建字符串数组,那么这样做:(我认为你需要这个

char* arg[1024];
arg[i] = (char*)calloc(1024,sizeof(char)); 

其中i是索引。

你说segmentation fault.但我认为你应该得到arg = (char**)calloc(1024,sizeof(char*));语句的编译错误。 错误:分配

时不兼容的类型

我还注意到parse()中的错误。 (由 Veger 回答)
您还可以使用strsep()函数解析buffer字符串,此处my answer可用于此目的。

答案 2 :(得分:1)

arg已在您的案例中分配。你说你需要它是1024个元素大 - 它静态分配

=>退出char *arg[1024]并将其替换为char **arg