我实际上是在学习C而且我遇到了“问题”。
我创建了一个指向带有char *和int with malloc(1)的结构的指针。 指针有效,我可以毫无问题地编辑结构子。
我还创建了一个指向int的指针(仍然使用malloc(1))并且它可以工作。另一件事是当我试图访问*(指针+ 33780)时,我没有得到核心转储错误(当值稍微高一点时核心转储)它工作,但默认值为0。
谢谢,这不是“问题”,但我想知道为什么这样做。
对不起是英国的凶手。
编辑:这里是代码
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;
}
答案 0 :(得分:2)
实际上,函数malloc不会分配大小为1字节或类似小值的内存范围。通常,分配范围的最小大小等于16字节的段落大小。
所以,如果你要写例如
char *p = malloc( 1 );
那么分配范围的实际大小可以等于16个字节。
Nevertheles你不应该依赖这个功能,因为根据C标准,这是未定义的行为。
答案 1 :(得分:2)
struct Personne *testPoint = malloc(1);
让您进入未定义行为的领域。不幸的是,UB可以包括“程序在所有测试环境中正确运行但在最糟糕的时间内无法生产” - 而且经常这样做。
如果你在Linux上运行你的程序在valgrind和/或电围栏下。您将看到为什么存在这些工具。
答案 2 :(得分:0)
你需要:
struct Personne *testPoint = malloc(sizeof(*testPoint));
1个字节的内存不足以满足您的结构需求。 malloc()
参数的含义是字节数。但是,malloc()
并不一定能保护内存超出分配的段,因此在某些情况下可以覆盖边界而不会产生致命的后果。