具有结构工作的 C malloc(1)
C malloc(1) with structure working
我实际上正在学习 C,并且我得到了 "problem"。
我使用 malloc(1) 创建了一个指向具有 char* 和 int 的结构的指针。
指针有效,我可以毫无问题地编辑结构子项。
我还创建了一个指向 int 的指针(仍然使用 malloc(1))并且它可以工作。另一件事是,当我尝试访问 *(pointer + 33780) 时,我没有收到核心转储错误(当值稍高时会出现核心转储)它有效,但默认值为 0.
谢谢,这不是 "problem" 但我想知道为什么会这样。
抱歉成为英国人的凶手。
编辑:这里是代码
struct Personne
{
char *name;
int age;
};
int main(int argc, char *argv[])
{
printf("%ld\n", sizeof(struct Personne));
struct Personne *testPoint = malloc(1);
printf("testPoint : %p\n", testPoint);
printf("testPoint : %p\n", testPoint->name);
testPoint->name = "UnNomInconnu";
testPoint->age = 20;
free(testPoint);
return 0;
}
实际上,malloc 函数并没有分配恰好为 1 字节大小或类似小值的内存范围。通常分配的区段的最小大小等于段落的大小,即 16 字节。
因此,如果您将编写示例
char *p = malloc( 1 );
那么分配的extent的实际大小可以等于16字节
然而你不应该依赖这个特性,因为一般来说,根据 C 标准,这是未定义的行为。
你需要:
struct Personne *testPoint = malloc(sizeof(*testPoint));
1 个字节的内存不足以容纳您的结构。 malloc()
参数的含义是字节数。但是,malloc()
不一定会保护超出分配段的内存,因此在某些情况下可以覆盖边界而不会造成致命后果。
struct Personne *testPoint = malloc(1);
让您进入未定义行为的领域。不幸的是,UB 可以包含 "the program runs correctly in all test environments but fails in production at worst possible time" - 并且经常包含。
如果你在linux运行你的程序下用valgrindand/or电围栏。您将了解为什么存在这些工具。
我实际上正在学习 C,并且我得到了 "problem"。
我使用 malloc(1) 创建了一个指向具有 char* 和 int 的结构的指针。 指针有效,我可以毫无问题地编辑结构子项。
我还创建了一个指向 int 的指针(仍然使用 malloc(1))并且它可以工作。另一件事是,当我尝试访问 *(pointer + 33780) 时,我没有收到核心转储错误(当值稍高时会出现核心转储)它有效,但默认值为 0.
谢谢,这不是 "problem" 但我想知道为什么会这样。
抱歉成为英国人的凶手。
编辑:这里是代码
struct Personne
{
char *name;
int age;
};
int main(int argc, char *argv[])
{
printf("%ld\n", sizeof(struct Personne));
struct Personne *testPoint = malloc(1);
printf("testPoint : %p\n", testPoint);
printf("testPoint : %p\n", testPoint->name);
testPoint->name = "UnNomInconnu";
testPoint->age = 20;
free(testPoint);
return 0;
}
实际上,malloc 函数并没有分配恰好为 1 字节大小或类似小值的内存范围。通常分配的区段的最小大小等于段落的大小,即 16 字节。
因此,如果您将编写示例
char *p = malloc( 1 );
那么分配的extent的实际大小可以等于16字节
然而你不应该依赖这个特性,因为一般来说,根据 C 标准,这是未定义的行为。
你需要:
struct Personne *testPoint = malloc(sizeof(*testPoint));
1 个字节的内存不足以容纳您的结构。 malloc()
参数的含义是字节数。但是,malloc()
不一定会保护超出分配段的内存,因此在某些情况下可以覆盖边界而不会造成致命后果。
struct Personne *testPoint = malloc(1);
让您进入未定义行为的领域。不幸的是,UB 可以包含 "the program runs correctly in all test environments but fails in production at worst possible time" - 并且经常包含。
如果你在linux运行你的程序下用valgrindand/or电围栏。您将了解为什么存在这些工具。