gpt4 book ai didi

c - 了解结构体和 malloc 中的指针

转载 作者:行者123 更新时间:2023-11-30 15:48:56 25 4
gpt4 key购买 nike

我正在学习 C(正在阅读 Sam 的《24 小时内自学 C》)。我已经了解了指针和内存分配,但现在我想知道它们在结构内部的情况。

我写了下面的小程序来玩玩,但我不确定它是否可以。在 Linux 系统上使用 gcc 进行编译,并使用 -Wall 标志进行编译,没有任何错误,但我不确定这是否 100% 值得信赖。

是否可以像我在下面所做的那样更改指针的分配大小,或者我是否可能踩到相邻内存?我在结构中做了一些前/后变量来尝试检查这一点,但不知道这是否有效以及结构元素是否连续存储在内存中(我猜是这样,因为指向结构的指针可以传递给通过指针位置操作的函数和结构)。另外,如何访问指针位置的内容并迭代它,以便确保如果它是连续的,则不会覆盖任何内容?我想我要问的一件事是如何以这种方式调试内存困惑,以知道它不会破坏任何东西?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct hello {
char *before;
char *message;
char *after;
};

int main (){
struct hello there= {
"Before",
"Hello",
"After",
};
printf("%ld\n", strlen(there.message));
printf("%s\n", there.message);
printf("%d\n", sizeof(there));
there.message = malloc(20 * sizeof(char));
there.message = "Hello, there!";
printf("%ld\n", strlen(there.message));
printf("%s\n", there.message);
printf("%s %s\n", there.before, there.after);
printf("%d\n", sizeof(there));
return 0;
}

我认为有些事情不对劲,因为我的那里的大小没有改变。kj

亲切的问候,

最佳答案

不太好,你有内存泄漏,你可以使用 valgrind在运行时检测它(在 Linux 上)。

您正在编码:

there.message = malloc(20 * sizeof(char));
there.message = "Hello, there!";

第一次分配调用malloc(3) 。首先,当调用 malloc 时,您应该始终测试它是否失败。但事实上,它通常会成功。所以至少更好的代码:

there.message = malloc(20 * sizeof(char));
if (!there.message)
{ perror("malloc of 20 failed"); exit (EXIT_FAILURE); }

第二个赋值将常量文字字符串“Hello,there!”的地址放入同一个指针there.message中,并且您丢失了第一个值。您可能想复制该常量字符串

strncpy (there.message, "Hello, there!", 20*sizeof(char));

(您可以只使用 strcpy(3) 但要小心缓冲区溢出)

您可以使用 strdup(3) 获取某个字符串的新副本(在堆中) (GNU libc 也有 asprintf(3) ...)

there.message = strdup("Hello, There");
if (!there.message)
{ perror("strdup failed"); exit (EXIT_FAILURE); };

最后,在程序结束时释放堆内存是个好习惯。(但是操作系统会在 _exit(2) 时间抑制进程空间。

了解有关C 编程的更多信息,memory management , garbage collection 。也许考虑使用 Boehm's conservative GC

C 指针只是一个内存地址区域。应用程序需要知道它们的大小。

PS。即使对于经验丰富的资深程序员来说,C 中的手动内存管理也很棘手。

关于c - 了解结构体和 malloc 中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16535753/

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