通过指针在C中进行内存分配

时间:2011-06-02 12:39:24

标签: c

我正在学习如何使用指针,因此我编写了以下程序,将区间[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;
} 

3 个答案:

答案 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时,增加的内存地址位置可能是进程内存地址空间,这就是内核为此过程发送分段错误的原因。