当前位置:  开发笔记 > 编程语言 > 正文

是什么原因导致整数指针重新分配崩溃?

如何解决《是什么原因导致整数指针重新分配崩溃?》经验,为你挑选了3个好方法。

我是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位.我们甚至没有提到过缓存问题.



1> Tamas Czineg..:

因为您尝试将100写入内存位置0x0000000A,这可能未分配给您的程序.那是,

int *a = 10;

并不意味着指针'a'将指向存储器中具有值10的位置.这意味着它指向存储器中的地址10(0x0000000A).然后,您想要在该地址中写入内容,但是您没有这样做的"权限",因为它没有被分配

您可以尝试以下方法:

int *a = malloc(sizeof(int));
*a = 100;

这可行,但效率极低.如果你只需要一个int,你应该把它放到堆栈中,而不是堆.在32位架构上,指针长度为32位,int也是32位长,因此指向int的指针结构以这种方式占用(至少)8字节的内存空间而不是4位.我们甚至没有提到过缓存问题.



2> gimel..:

您需要将指针分配给内存位置,而不是任意值(10).

int cell = 10;
int *a = &cell; // a points to address of cell
*a = 100;       // content of cell changed

见我的回答另一个问题时,大约是小心Ç.



3> unwind..:

我想建议稍微改变malloc()的使用,对于建议使用它来为int分配内存的所有答案.代替:

a = malloc(sizeof(int));

我建议不要重复变量的类型,因为编译器已知并且手动重复它会使代码更加密集,并带来错误风险.如果您稍后将声明更改为例如

long *a;

在不改变分配的情况下,最终会分配错误的内存量(在一般情况下,在32位计算机上int并且long通常大小相同).这是IMO,更好用:

a = malloc(sizeof *a);

这仅仅意味着"a指向的类型的大小",在这种情况下int,这当然是完全正确的.如果您如上所述更改声明中的类型,则此行仍然正确.如果您在作业的左侧更改变量的名称仍然存在风险,但至少您不再需要不必重复信息.

还要注意,sizeof在实际对象(即变量)上使用它时,不需要括号,只能使用类型名称,它们看起来像强制转换表达式.sizeof它不是一个功能,它是一个操作员.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有