我正在学习如何使用指针,因此我编写了以下程序,将区间[1,100]中的整数值分配给内存中的某些随机位置。
当我读取这些内存位置时,printf显示所有值,然后给我一个分段错误。这似乎是一种奇怪的行为,因为我希望看到所有的值或者一个seg错误,但不能同时看到两者。
有人可以解释为什么我要看到两者吗?
感谢。这是代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
char first = 'f';
char *ptr_first = &first;
int i=1;
for(i=1;i<101;i++)
*(ptr_first+i) = i;
for(i=1;i<101;i++)
printf("%d\n", *(ptr_first+i));
return EXIT_SUCCESS;
}
答案 0 :(得分:5)
一点都不奇怪。您正在使用堆栈中的变量first
。你基本上做的是愉快地覆盖堆栈(否则从堆栈上的缓冲区溢出中得知),因此可能会破坏任何返回地址等等。
由于libc调用main
,因此返回libc会导致崩溃。
答案 1 :(得分:2)
您正在访问超出分配给first
的内存。它只是一个字符,并且通过ptr_first
指针,您可以访问超过此字符的100个位置到无保留的内存。这可能会导致段错误。
您必须确保原始变量有足够的内存保留用于指针访问。例如:
char first[100];
这将首先转换为100个字符的数组(基本上是100个字节的存储空间,您可以通过指针访问)。
另请注意,您正在将int
插入到char指针中。这将起作用,但int的值将被截断。您应该使用char
作为i
的类型。
答案 2 :(得分:0)
因为ptr_first指针首先指向char变量。现在当你递增ptr_first时,增加的内存地址位置可能是进程内存地址空间,这就是内核为此过程发送分段错误的原因。