gpt4 book ai didi

c - 内存分配如何与 char 指针(字符串文字、数组)一起使用?

转载 作者:行者123 更新时间:2023-12-05 08:45:27 24 4
gpt4 key购买 nike

目前正在阅读 K&R 并且偶然发现了字符指针。 rn书上定义char指针的时候没有讲到内存分配,可能后面会解释。但这没有意义,所以我正在寻求帮助:)

1

// No errors
char *name;
char *altname;
strcpy(altname,name);

2

// No errors, internals of *name have been successfully moved to *altname
char *name = "HI";
char *altname;
strcpy(altname, name);

3

// Segmentation fault, regardless of how I define *altname
char *name = "HI";
char *altname = "randomstring";
strcpy(altname, name);

4

// Segmentation fault, regardless of how I define *altname
char *name;
char *altname = " ";
strcpy(altname, name);

5

// copies internals of *name only if size of char s[] > 8???
char s[9];
char n[] = {'c', 'b'};
char *name = n;
char *altname = s;
strcpy(altname, name);

为什么第一个示例没有产生错误,即使没有分配内存?

为什么第二个成功地将 name 复制到 altname,即使没有为 altname 分配内存;

为什么第三个和第四个core dump?

为什么第五个要求s的大小>8?

最佳答案

我对前两个示例的运行感到有点惊讶。 strcpy 将第二个参数指向的字符数组复制到第一个参数指向的字符数组中。

在您的第一个示例中,指针 namealtname 没有指向任何东西。它们是未初始化的指针。现在,它们具有一些值(value),这取决于执行 main 函数时内存中的任何垃圾,或者只是编译器决定初始化它们。这就是为什么我对您的代码没有崩溃感到惊讶。

无论如何,您的第三个示例出现段错误的原因是您将两个指针都设置为指向字符串文字(即 "HI""randomstring") .字符串文字(很可能)存储在内存的只读部分中。因此,当您在目标指针设置为 altname 的情况下运行 strcpy 时,您正在尝试写入只读内存。这是对内存的无效使用,因此导致崩溃。您的第四个示例也是如此。

在最后一个示例中,您的问题是 n 不是以 null 结尾的。 strcpy 不断复制字符,直到到达终止符(即 '\0')。您在数组中放置了一个 'c' 和一个 'b' 但没有终止符。因此,即使到达 n 的末尾,strcpy 也会继续复制。它在 sizeof(s) 大于 8 时起作用的事实可能涉及空字节 happens 存在于您的堆栈中的位置。也就是说,如果您使 s 太小,您将超出它的末尾并破坏堆栈上的内存。您可能正在覆盖返回指针,从而在函数执行完毕后返回到某个无效的内存地址。

您需要做的是,不使用指针,而是使用数组。这将为您提供可写内存部分所需的存储空间。您还需要确保您的数组以 null 结尾。这可以通过使用字符串文字初始化数组来自动完成。

char name[] = "HI";
char altname[] = "randomstring";
strcpy(altname, name);
char s[3]; // Enough space to hold "cb" plus a null-terminator.
char n[] = "cb";
char *name = n;
char *altname = s;
strcpy(altname, name);

关于c - 内存分配如何与 char 指针(字符串文字、数组)一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72789839/

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