0

我有一个数组如下:

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

   }
 }

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

4

3 回答 3

4
char* arg[1024];

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

除了您的分配问题之外,还有另一个错误。看一眼:

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

如果 会发生什么buffer = "test"?您的while-loop 将找不到空间并继续在外部迭代buffer。导致各种未定义的行为......

要修复它,您还需要检查字符串终止符:

while(*buffer != 0 && *buffer != ' ')
    buffer++;
于 2013-01-10T09:49:04.507 回答
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字符串,这里我的回答可能对此有用。

于 2013-01-10T09:49:12.767 回答
1

arg 已在您的情况下分配。你说你需要它是 1024 个大元素——它是静态分配的

=> 将其排除在外char *arg[1024]并替换为char **arg

于 2013-01-10T09:51:25.827 回答