gpt4 book ai didi

c - 我的程序中是否存在悬空指针?

转载 作者:行者123 更新时间:2023-11-30 20:41:03 25 4
gpt4 key购买 nike

char** removeDuplicateChromosomes(char* input[], int no_of_chromosomes)
{
char** result = (char**) malloc(sizeof(char* )*(no_of_chromosomes));

//some piece of code
result[count] = input[itr];
//some piece of code . I didn't free any pointers here in this function

return result;
}

有人可以帮助我识别任何悬空指针(如果存在)并解释相同的问题吗?

最佳答案

内存泄漏 - 如果没有指针指向未释放的内存。
悬空指针 - 指向已释放内存的指针。

您的代码存在这两种情况之一的重大风险,尽管没有完整的代码示例,无法判断是否会发生其中一种情况。我只会给出一些可能发生的情况。

首先要注意的是,如果您不在调用函数中释放 result 的内存,则会出现内存泄漏。任何 malloc 都必须有相应的 free

如果您像这样自由输入:

free(input);

不会有悬空指针。

但是,如果 input 的每个元素没有 result 的元素指向同一内存,则可能会出现内存泄漏。如果 result 的多个元素指向此内存,当您尝试释放它时,您可能会得到一个悬空指针,以及一些未定义的行为。

如果您像这样自由输入:

int i;
for (i = 0; i < inputSize; i++)
free(input[i]);
free(input);

会有一个悬空指针。

为什么?

input[itr]; 是一个指针。

result[count] = input[itr]; 只是使 result[count] 指向与 input[itr] 相同的内存> 指向。

因此,如果我们释放input[itr]result[count]将指向已释放的内存,因此是悬空的。

如果我们不释放input[itr]result[count]仍将指向有效内存。

如果您希望 result[count] 指向其自己的内存,则必须使用:

result[count] = malloc(inputItrSize);
memcpy(result[count], input[itr], inputItrSize);

注意 - 无法知道 input[itr] 指向多少内存,因此您必须自己声明 inputItrSize 具有适当的大小。

关于c - 我的程序中是否存在悬空指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19201469/

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