【发布时间】:2021-04-13 00:56:12
【问题描述】:
我的问题是它无法将内存分配给 (char*) 指针,我似乎无法理解为什么。 我回顾了其他类似的问题,但我似乎无法掌握答案。 我试图返回一个字符串列表,但我知道在 C 中我不能返回 char**,但我可以通过 char** 参数来做到这一点。我的尝试是在下面的代码 sn-ps 中。
在交流中
void list(char** fileList) {
int fileIndex = 0;
fileList = (char**)malloc(DIRECTORY_SIZE * sizeof(char*));
while ((dir = readdir(currentDirectory)) != NULL)
{
fileList[fileIndex] = (char*)malloc(FILENAME_LENGTH * sizeof(char)); //It fails here
fileList[fileIndex] = strncpy(fileList[fileIndex], dir->d_name, FILENAME_LENGTH);
fileIndex++;
printf("%s\n", fileList[fileIndex]);
}
}
在 main.c 中
int main() {
char** fileList;
list(fileList);
for(int i = 0; i < 10; i++) {
printf("%s\n", fileList[i]);
}
}
我已经看过这些问题了:
【问题讨论】:
-
该函数处理参数表达式值的副本。更改副本不会影响原始参数。所以在 main 你有未初始化的指针 char** fileList;调用函数后仍然保持原样。
-
"...但我知道在 C 中我不能返回 char**" 谁告诉你的?您可以返回
char**值 - 就您而言,这样做是有意义的。 -
@VladfromMoscow,是的,这是有道理的,但我仍然无法在函数内部分配内存。
-
如果将
while条件测试更改为while (fileIndex < DIRECTORY_SIZE && (dir = readdir(currentDirectory)) != NULL)会怎样? -
fileIndex++;和printf("%s\n", fileList[fileIndex]);语句在while循环中是错误的,因此它试图打印一个由垃圾指针值定位的字符串。此外,如果任何dir->d_name字符串至少与FILENAME_LENGTH一样长,strncpy(fileList[fileIndex], dir->d_name, FILENAME_LENGTH);将不会附加空终止符。
标签: c pointers memory-management