Malloc之后的Strcpy段错误

时间:2015-10-26 00:57:12

标签: c arrays segmentation-fault malloc strcpy

所以,我在C中编写了一个简单的切片函数,它接受一个字符串数组,标记切片开头的字符串以及切片的大小。在函数i malloc中新建一个数组,然后继续将切片中的每个字符串复制到新数组中。但是,我在第一个strcpy上得到了一个段错误,即使我已经为结果数组提供了malloced空间。

代码如下所示:

char** slice(char** args, char* start, int size){
  int i = 0;
  // need to find start first
  char* cursor = args[0];
  int j = 0;
  while(cursor != NULL){
    if(strcmp(cursor, start) == 0){
      break;
    }
    j++;
    cursor = args[j];
  }
  char** result = malloc(MAX_INPUT * size);
  while(i < size){
    strcpy(result[i], args[j+i]);
    i++;
  }
  return result;
}

产生段错误的行是 -

strcpy(result[i], args[j+i]);

我用gdb来查看结果和args中的值是什么, result [i]是0x0,这是NULL,但结果本身是一个地址,但我不确定为什么malloc不工作。我用完了堆栈空间吗?这是否意味着我搞砸了?

2 个答案:

答案 0 :(得分:2)

result[i]是一个未初始化的指针。您犯了与以下相同的错误:

char *ptr;
strcpy(ptr, args[j+i]);

在将字符复制到其中之前,必须使result[i]指向某个已分配的空间。此外,MAX_INPUT * size是为指针数组分配的错误空间量。

另一个问题是,如果size大于start之后数组中剩余字符串的数量,那么您将读取数组的末尾。

然后你的函数永远不会在新数组的末尾放置NULL,因此调用者无法知道你返回的切片有多大。

同样cursor是多余的,你可以写args[j]。基本上这个功能完全是一团糟。

代码可以是(警告:未经测试):

char** slice(char** args, char const *start, int slice_size)
{
// Find index of "start"
    int start_index;

    for (start_index = 0; args[start_index]; ++start_index)
         if ( !strcmp(args[start_index], start) )
              break;

// Abort if "start" was not present (remove this line if you want to
// instead return an empty terminated list)
    if ( !args[start_index] )
         return NULL;

// Allocate array of pointers to new strings, allowing space for terminator
    char **result = malloc((slice_size + 1) * sizeof *result);
    if ( !result )
        return NULL;

// Copy strings in, allocating space for each string, stopping if no more args
    int i;
    for (i = 0; i < slice_size && args[start_index + i]; ++i)
         result[i] = strdup(args[start_index + i]);

// Terminate the list
    result[i] = NULL;

    return result;
}

答案 1 :(得分:0)

这一行:

char** result = malloc(MAX_INPUT * size);

mallocs MAX_INPUT字符的大小。 'size'的内容是什么意思。

总的来说,我需要的是一些我在代码中看不到的char *的malloc。

然后,在获得malloc参数后,

代码需要为每个字符串使用strdup()而不是strcpy() - 或 - malloc空间,然后使用strcpy(),可能在包含两个函数调用的循环中