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

C 将二维数组复制到函数外部动态分配的二维数组,c,pointers,multidimensional-array,crash,copy,C,Pointers,Multidimensional Array,Crash,Copy,我有fullNames,它是一个二维数组,在其中对全名进行了排序,我想将其内容复制到sortedNames,这是一个存在于此函数外部的二维数组。(我将***sortedNames作为参数) 我动态分配了这个数组,但是复制没有成功。第四次尝试将名称从全名复制到sortedNames后,程序崩溃。为什么? stringcpy和stringlen是我创建的函数。他们做的事情和strcpy和strlen做的一样 /*allocating memory for sortedNames*/ *sortedN

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

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

stringcpy
stringlen
是我创建的函数。他们做的事情和strcpy和strlen做的一样

/*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]);
}
/*为已分类的名称分配内存*/
*分类名称=(字符**)malloc(n)/*n是名称的数目*/
/*为每个sortedNames阵列分配内存*/
对于(i=0;i
如果没有为指针数组分配足够的内存,则应按以下方式分配:

*sortedNames = (char**)malloc(n * sizeof(char *));
此外,为什么不使用
strlen
strcpy
代替
stringlen
stringcpy
?这仅仅是一个输入错误,还是这些函数执行了一些额外的功能

关于Cuxon代码> MalOC:<代码>返回值,如果您不打算将C++代码编译为C++,可以将其删除:

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

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

应进行两次编辑,因为分配的内存可能不足。此代码:

(*sortedNames)[i] = (char*) malloc(n);
为n个字节分配内存,而您需要为(n*字符串大小)字节分配内存。第二个malloc可以工作,因为char占用1个字节。但是尝试使用sizeof()使其独立于系统

正确的代码是:

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

n是要分配的名称数或总大小>。您应该修改问题以包含函数原型。它是
void myfunction(char***sortedNames,const char**fullNames,size\u t n)
?。或者干脆
*sortedNames=malloc(n*sizeof**sortedNames)@Paul R:我不同意,特别是考虑到问题中缺乏信息。我们不知道分类名称的类型。如果类型不是真正的
char***sortedNames
或等效类型,则显式强制转换将阻止编译。即使在您提到的特定情况下,您也只是在用一个潜在问题交换另一个潜在问题。一般来说,强制转换(尤其是冗余强制转换)是一种代码气味,除了在没有其他更合适的解决方案时作为最后手段之外,应该避免available@PaulR:我大体上同意你的看法。在这种特殊情况下,我将使用一个宏来强制执行类型检查:
#定义ALLOC(type,n)((type*)calloc(n,sizeof(type))
。需要@PaulR:-)的相同注释。为什么,哦,为什么,你要转换malloc->don t。意思是摆脱
(char*)
。我不同意,尤其是考虑到问题中缺乏信息。我们不知道分类名称的类型。如果类型确实不是
char***sortedNames
或等效类型,则显式强制转换将阻止编译。