gpt4 book ai didi

c - 动态分配和复制数组

转载 作者:行者123 更新时间:2023-12-04 10:35:36 27 4
gpt4 key购买 nike

我有时会看到这样的代码:

char* copyStr(char* input) {
int inputLength;
char *answer;

inputLength = strlen(input);

answer = malloc(inputLength + 1);
answer = input;

return answer;
}

人们常说这段代码不起作用,这种模式

answer = malloc(inputLength + 1);
answer = input;

没有意义。为什么会这样?在我看来,代码没问题。它为答案分配适量的内存,然后将输入复制到答案中。它似乎在我的测试中有效,例如

int main()
{
printf ("%s\n", copyStr("Hello world!"));
}

做我期望的事情。那么它有什么问题呢?

最佳答案

简单来说。这段代码:

var = foo();
var = bar();

在所有1 情况下 100% 等同于此:

foo();
var = bar();

此外,如果 foo() 没有副作用,它 100% 等同于最后一行:

// foo(); 
var = bar();

这适用于任何函数,包括 malloc。如果我们暂时忘记 malloc 做了什么而只关注刚才所说的内容,我们可以很快意识到这段代码的注释中写的是什么:

answer = malloc(inputLength + 1);
// Here, the variable answer contains the return value from the call to malloc
answer = input;
// Here, it contains the value of input. The old value is overwritten, and
// is - unless you saved it in another variable - permanently lost.

malloc 的作用非常简单。它返回一个指向内存块的指针,如果分配失败则返回一个 NULL 指针。2 就是这样。您使用像 ptr = malloc(size) 这样的调用所做的事情绝对没有比将地址存储在指针变量 ptr 中更花哨的了。同样,指针变量并不比 intfloat 等其他变量更花哨。 int 存储一个整数。指针存储内存地址。这里没有魔法。

1它是 100% 等价的,除了你正在做非常花哨的事情,比如用外部程序读取变量 var 2malloc(0) 可以返回一个非空指针,但在实践中它并没有什么区别,因为取消引用它是未定义的行为,并且分配零字节是一个非常没有意义(哈哈,点)的操作。

关于c - 动态分配和复制数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58983444/

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