我有fullNames
,这是一个二维数组,其中有排序的全名,我想将其内容复制到sortedNames
中,这是一个存在于此函数之外的二维数组。(我得到***sortedNames
作为参数)。
我动态分配了这个数组,但是复制没有成功。在第4次尝试将名称从fullNames
复制到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]);
}
你没有为指针数组分配足够的内存,你应该这样分配:
*sortedNames = (char**)malloc(n * sizeof(char *));
此外,为什么不用strlen
和strcpy
来代替stringlen
和stringcpy
呢?这只是一个打字错误还是这些函数执行了一些额外的功能?
关于malloc
返回值的强制转换,如果你不打算将代码编译为c++,你可以删除它,并这样写:
*sortedNames = malloc(n * sizeof(**sortedNames));
关于**sortedNames
周围的额外括号,请注意它们不是必需的,因此您可以根据本地样式约定删除它们或不删除它们。
应该有2个编辑,因为分配的内存可能不够。代码:
(*sortedNames)[i] = (char*) malloc(n);
为n字节分配内存,而您需要为(n*字符串大小)字节分配内存。第二个malloc可以作为char占用1字节。但请尝试使用sizeof()使其与系统无关。
正确的代码应该是:
(*sortedNames)[i] = malloc(n*sizeof(char *));