【发布时间】:2016-02-27 06:41:15
【问题描述】:
我实际上是在学习 C 并且遇到了一个“问题”。
我用 char* 和 malloc(1) 创建了一个指向结构的指针。 指针有效,我可以毫无问题地编辑结构子项。
我还创建了一个指向 int 的指针(仍然使用 malloc(1))并且它可以工作。另一件事是当我尝试访问 *(pointer + 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;
}
【问题讨论】:
-
您确实应该显示实际代码。但请理解:如果您访问应用程序有效内存空间之外的内存,您可能会也可能不会遇到分段错误或任何其他错误。没有错误并不表示代码中没有问题。您可能已经访问了目前不会造成任何不良影响的远程内存。在这种
malloc的特殊情况下,它可能是内存堆中属于另一个进程的某个其他位置,或者仍然可供另一个进程(或您的进程)分配。这将是无效的访问。 -
您正在调用未定义的行为,因为您正在访问尚未正确分配的内存,使用不同类型的指针等等等。未定义的行为意味着任何事情都可能发生,例如崩溃,但它也可以是其他任何东西——程序甚至可以完成执行并产生正确的结果。
-
两个小问题:使用
printf("%zu\n", sizeof(struct Personne));和使用printf("testPoint : %p\n", (void*)testPoint); -
确实应该有一个规范的重复问题,用于询问为什么他们在做他们知道是无效的事情时没有得到错误的所有问题。