gpt4 book ai didi

c - 在这种情况下要求 `malloc()`

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

现在,我正在研究 Yale course .

其中一个片段是:

char *
strdup(const char *s)
{
char *s2;

s2 = malloc(strlen(s)+1);

if(s2 != 0) {
strcpy(s2, s);
}

return s2;
}

如果我理解正确的话,我们在这里需要一个malloc(),因为我们正在将字符串s复制到另一个字符串s2中,所以我们需要为 s2 分配足够的空间。但是,当我尝试以下代码时:

#include <stdio.h>

int main(void) {
// your code goes here
char *str = "Test";

printf("%s", str);

return 0;
}

here ,它给了我正确和预期的输出。

所以,我有两个问题:

  1. 第一个代码段中是否需要 malloc(),因为我们需要 s2 是一个数组?

  2. 我是否在第二个片段中调用了 UB,(因为我没有声明 *str 指向一个数组)?我们需要一个数组,因为在 C 语言中,字符串存储为字符数组。

最佳答案

是的,需要复制字符串。 (你说的原因无关紧要)你正在分配内存来保存重复的字符串。在第二种情况下,您只是通过将指向文字的指针传递给 printf 来打印文字,您没有复制任何内容。

这里没有 UB - 这是合法代码。 char* str 正在将 char* 初始化为指向文字数组的衰减指针。衰减指针指向数组的第一个元素。

确实,字符串在 C 语言中存储为 char 数组 - 但它如何影响我们刚刚在第二个片段中看到的行为?我们正在传递一个 char*,它指向 null 终止的 char 数组,这正是 printf%s 说明符所期望的。

此外,文字具有静态存储持续时间。您不需要创建内存来存储它们。这是在您编写 "Test" 时隐式完成的。

关于c - 在这种情况下要求 `malloc()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48270513/

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