将二维数组复制到函数外部动态分配的二维数组

Posted

技术标签:

【中文标题】将二维数组复制到函数外部动态分配的二维数组【英文标题】:Copying a 2D array to a dynamically allocated 2D array outside of the function 【发布时间】:2015-08-17 06:28:46 【问题描述】:

我有fullNames,这是一个对其中的全名进行排序的二维数组,我想将其内容复制到sortedNames,这是一个存在于该函数之外的二维数组。 (我得到***sortedNames 作为参数)。

我动态分配了这个数组,但是复制没有成功。程序在第四次尝试将名称从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]);

【问题讨论】:

是n个名字还是要分配的总大小> Obligatory reminder about not casting the reuslt of malloc in C. 您应该修改您的问题以包含函数原型。是void myfunction(char ***sortedNames, const char **fullNames, size_t n)? 【参考方案1】:

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

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

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

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

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

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

【讨论】:

Obligatory reminder about not casting the reuslt of malloc in C. 或者干脆*sortedNames = malloc (n * sizeof **sortedNames); @Paul R:我不同意,特别是考虑到问题中缺乏信息。我们不知道sortedNames 的类型。如果类型确实不是 char ***sortedNames 或等效类型,则显式转换将阻止编译。 好吧,即使在您提到的特定情况下,您只是在用一个潜在问题换另一个问题。一般来说,强制转换(尤其是冗余强制转换)是一种代码味道,应该避免,除非在没有其他更合适的解决方案可用时作为最后的手段 @Paul R:我同意你关于演员阵容的看法。在这种特殊情况下,我会使用宏来强制进行类型检查:#define ALLOC(type, n) ((type*)calloc(n, sizeof(type)))【参考方案2】:

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

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

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

正确的代码是:

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

【讨论】:

需要@PaulR 的相同评论 :-) 为什么,哦,为什么,你 cast malloc -> 不。意思是摆脱 (char *). 我不同意,特别是考虑到问题中缺乏信息。我们不知道sortedNames 的类型。如果类型确实不是 char ***sortedNames 或等效类型,则显式转换将阻止编译。

以上是关于将二维数组复制到函数外部动态分配的二维数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中动态分配二维数组? [复制]

C++:使用迭代器构造一个二维动态分配的数组

动态分配的二维数组

如何使用 C++ 中的指针动态分配和解除分配二维数组?

C语言如何在子函数中对主函数中的二维数组值进行修改? 二维数组已经在主函数中用动态数组分配了空间。

c++ 动态分配二维数组 new 二维数组