gpt4 book ai didi

c - 试图更好地理解 C 大小

转载 作者:太空宇宙 更新时间:2023-11-04 01:02:20 25 4
gpt4 key购买 nike

首先,代码可以工作,但有一段时间没用了,我试图理解为什么我所做的修复了它。

所以我有一个函数:

int array_size(const char **array) {
int i = 0;

while (array[i] != NULL) ++i;

return i;
}

我还有这个指针,我从一个元素开始,调用一个修改 local_mig 的函数:

int main(void) {
char **local_mig = malloc(sizeof(char *) * 1);

populate_local_mig(&local_mig);

int size = array_size(local_mig); // 9
}

这个函数看起来像这样(注意倒数第二行的注释):

void populate_local_mig(char ***local_mig) {
// ...above here reads a directory with 5 .sql files
while ((directory = readdir(dir)) != NULL) {
int d_name_len = strlen(directory->d_name);

char *file_name = malloc(sizeof(char) * (d_name_len + 1));

strcpy(file_name, (const char *)directory->d_name);

size_t len = strlen(file_name);

if (len > 4 && strcmp(file_name + len - 4, ".sql") == 0) {
(*local_mig)[i] = malloc(sizeof(char) * (len + 1));
strcpy((*local_mig)[i], file_name);
++i;

*local_mig = realloc(*local_mig, sizeof(char *) * (i + 1));
}
}

//(*local_mig)[i] = NULL;
}

还在我身边吗?好。

稍后,我调用 array_size(local_mig); 并返回 9。什么?我期待 5。所以当我稍后迭代 local_mig 时,我最终在它尝试读取第 6 个元素时出现段错误。

所以,我添加了 (*local_mig)[i] = NULL; 突然一切正常,它返回了 5,就像它应该的那样。

我一直认为,因为我分配了足够的空间来容纳每个字符数组,所以大小显然是我调整 local_mig 大小的次数。

原来我错了……非常非常错误。但是为什么,我问...

最佳答案

如果您没有将列表中的最后一个指针设置为 NULL,您将在 array_size 函数中遇到未定义的行为,因为它刚好超过数组的末尾(没有标记到停止它)并进入您可能不拥有且未初始化的内存中。

9 的意外大小是上述未定义行为的结果。这可能是当时内存中的任何结果。不过,实际上,有了 UB,一切皆有可能。

关于c - 试图更好地理解 C 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33491389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com