将2D数组复制到函数外部的动态分配的2D数组

时间:2015-06-03 07:24:20

标签: c pointers multidimensional-array crash copy

我有fullNames,这是一个已在其中排序全名的2D数组,我想将其内容复制到sortedNames,这是一个存在于此函数一侧的2D数组。 (我将***sortedNames作为参数)。

我动态分配了这个数组,但是复制没有成功。第4次尝试将名称从fullNames复制到sortedNames后,程序崩溃。为什么呢?

stringcpystringlen是我创建的函数。它们与strcpystrlen执行相同的操作。

/*allocating memory for sortedNames*/
*sortedNames = (char**) malloc(n);/*n is the number of names*/

/*allocating memory for each sortedNames array*/
for (i = 0; i < n; i++)
{
    (*sortedNames)[i] = (char*) malloc(stringlen(fullNames[i])+1);
}


/*Copying fullNames into sortedNames*/

for (i = 0; i < n; i++)
{
    stringcpy((*sortedNames)[i],fullNames[i]);
}

2 个答案:

答案 0 :(得分:4)

你没有为指针数组分配足够的内存,你应该这样分配:

*sortedNames = (char**)malloc(n * sizeof(char *));

此外,为什么不使用strlenstrcpy代替stringlenstringcpy?这只是一个错字或这些函数执行一些额外的功能吗?

关于malloc返回值的强制转换,如果您不打算将代码编译为C ++,则可以删除它并写下:

*sortedNames = malloc(n * sizeof(**sortedNames));

关于**sortedNames周围的额外括号,请注意它们不是必需的,因此您可以根据当地的样式惯例删除它们。

答案 1 :(得分:0)

应该有2次编辑,因为分配的内存可能不够。这段代码:

(*sortedNames)[i] = (char*) malloc(n);

为n个字节分配内存,而你需要内存(n *字符串的大小)字节。第二个malloc可以作为char占用1个字节。但是尝试使用sizeof()使其与系统无关。

正确的代码是:

 (*sortedNames)[i] = malloc(n*sizeof(char *));