为什么取消引用内存别名区域的C程序会导致分段错误?

the_endian
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *myptr = calloc(500,1);
    char *myptr2 = myptr;

    *myptr++ = 'A';
    *myptr++ = 'B';
    *myptr = '\0';
    /* This should dereference the beginning of the memory and print until myptr[2] which is '\0' */
    printf("Myptr2 points to: %s\n", *myptr2);

    free(myptr);

    return(EXIT_SUCCESS);
}

为什么第13行(printf行)创建SIGSEV?它应该指向内存的开始,然后printf应该打印直到它到达'\ 0'。

西奥多罗斯·查齐吉安娜基斯

您能从概念上讲出问题所在吗?如果取消引用内存的指针,这是什么原因?

%s格式字符串中有一个插槽时,printf期望将achar*作为相应的参数。这就是为什么你应该通过myptr2(这是地址'A',并从该字符串的字符随后的地址可以推断)。

如果您通过传递*myptr2,则基本上是传递字符'A'本身(不包含有关该特定字符在哪里的任何信息,'A'这将允许printf读取字符串的其余部分)。简而言之,printf期望在那里有一个指针,因此它尝试将相应的参数视为指针。

现在请注意,您传递的字符(通过取消引用a char*,因此获得achar的值为'A')的大小为1个字节,而指针的大小通常为4或8个字节。这意味着printf它将最有可能读取由字符和在堆栈中找到的一些随机数据组成的垃圾地址。在这种情况下,无法保证程序会发生什么,因此整个事件都将引发未定义的行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么与pthread链接会导致分段错误?

为什么传递带有const引用成员的结构会导致C2280错误?

为什么glibc的fclose(NULL)会导致分段错误而不是返回错误?

在“ for”循环初始化程序中取消引用指针会产生分段错误

为什么const int main = 195会导致程序正常运行,而没有const则会导致分段错误?

为什么以联合方式访问指针会导致分段错误?

为什么堆栈推送会导致分段错误?

为什么访问threadprivate变量会导致分段错误?

为什么继承会导致共享内存分段错误?

为什么释放内存会导致分段错误?

逐渐重新分配内存会导致分段错误

为什么与I / O相关的设置会导致分段错误?

为什么弹出堆栈中的最后一个元素会导致C中的分段错误?

为什么此代码会导致分段错误

为什么该程序会产生分段错误?

如何调试为什么我的C代码会导致分段错误?

C取消引用指针中的分段错误

为什么使用atoi命令行参数会导致分段错误

为什么会导致错误?

尝试在循环中访问数组元素会导致分段错误,为什么?

为什么strlen会导致C中的分段错误?

为什么命令行参数声明会导致分段错误

取消引用整数指针会导致分段错误

如何使用内存模型图计算代码的 o/p?为什么这会导致分段错误?

为什么使用 paho.mqtt.c 发送此消息会导致分段错误?

为什么这个双变量会导致分段错误?

为什么导致给定程序缓冲区溢出的输入会导致分段错误?

为什么在 C 中使用 round() 而不是 floor() 可能会导致错误/(程序错误)?

为什么以下会导致分段错误?