#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] 删除。
我来说两句