我是C的新手,我有这个问题.为什么以下代码崩溃:
int *a = 10; *a = 100;
Tamas Czineg.. 20
因为您尝试将100写入内存位置0x0000000A,这可能未分配给您的程序.那是,
int *a = 10;
并不意味着指针'a'将指向存储器中具有值10的位置.这意味着它指向存储器中的地址10(0x0000000A).然后,您想要在该地址中写入内容,但是您没有这样做的"权限",因为它没有被分配
您可以尝试以下方法:
int *a = malloc(sizeof(int)); *a = 100;
这可行,但效率极低.如果你只需要一个int,你应该把它放到堆栈中,而不是堆.在32位架构上,指针长度为32位,int也是32位长,因此指向int的指针结构以这种方式占用(至少)8字节的内存空间而不是4位.我们甚至没有提到过缓存问题.
因为您尝试将100写入内存位置0x0000000A,这可能未分配给您的程序.那是,
int *a = 10;
并不意味着指针'a'将指向存储器中具有值10的位置.这意味着它指向存储器中的地址10(0x0000000A).然后,您想要在该地址中写入内容,但是您没有这样做的"权限",因为它没有被分配
您可以尝试以下方法:
int *a = malloc(sizeof(int)); *a = 100;
这可行,但效率极低.如果你只需要一个int,你应该把它放到堆栈中,而不是堆.在32位架构上,指针长度为32位,int也是32位长,因此指向int的指针结构以这种方式占用(至少)8字节的内存空间而不是4位.我们甚至没有提到过缓存问题.
您需要将指针分配给内存位置,而不是任意值(10).
int cell = 10; int *a = &cell; // a points to address of cell *a = 100; // content of cell changed
见我的回答另一个问题时,大约是小心Ç.
我想建议稍微改变malloc()的使用,对于建议使用它来为int分配内存的所有答案.代替:
a = malloc(sizeof(int));
我建议不要重复变量的类型,因为编译器已知并且手动重复它会使代码更加密集,并带来错误风险.如果您稍后将声明更改为例如
long *a;
在不改变分配的情况下,最终会分配错误的内存量(在一般情况下,在32位计算机上int
并且long
通常大小相同).这是IMO,更好用:
a = malloc(sizeof *a);
这仅仅意味着"a指向的类型的大小",在这种情况下int
,这当然是完全正确的.如果您如上所述更改声明中的类型,则此行仍然正确.如果您在作业的左侧更改变量的名称仍然存在风险,但至少您不再需要不必重复信息.
还要注意,sizeof
在实际对象(即变量)上使用它时,不需要括号,只能使用类型名称,它们看起来像强制转换表达式.sizeof
它不是一个功能,它是一个操作员.