2012-07-02 154 views
13

可能重复:
Segmentation Fault when attempting to print value in C不能赋值给变量和指针

我很新的C,但不知道为什么这个程序中断。如果我删除了与i有关的行,程序就会编译并运行,但是如果我分配了i,那么我不能再为*ptr分配任何内容,而不会中断程序。

int main(void) 
{ 
    int i; 
    int *ptr; 

    i = 2; 
    *ptr = 5; 
    printf("%d",*ptr); 
} 
+2

[这](http://stackoverflow.com/questions/11278085/segmentation-fault-when-前试图打印价值在C)几乎相同的问题昨天才被问到。 – pb2q

+0

问题是你已经创建了一个指针,但没有给它指向任何东西。您可以使用新分配一些内存,或者将它指向像i这样的变量。 – jlunavtgrad

回答

11

您将指针保留为未初始化的值。因此,当您解除引用时(*ptr),您访问内存中的任意位置,导致分段错误。

ptr的东西将其分配给ptr本身(不*ptr)的变量(如&i)地址或一些新分配的内存(如malloc(sizeof(int)))。

+0

那么,为什么它只是使用 'int * ptr;' '* ptr = 5;'? –

+0

它可能“工作”,或者可能会崩溃,具体取决于您的平台,编译器,设置......无论哪种方式,这是不正确的。 C是一种不安全的语言,它不检查内存错误,它们可能不会被注意到你的程序,并在不期望的时候触发。 :) – Kos

+1

谢谢!我从来没有使用过手动内存管理语言,所以这对我来说都是新的。当然还有更多想法。 –

-1

在C中使用指针之前,您需要将指针设置为现有的内存块,您需要为其分配内存,就像这样。

int *ptr = (int *)malloc(sizeof(int)); 
4

下面是答案为C:

int main(void) { 
    int i; 
    int * ptr = (int *)malloc(sizeof(int)); 

    i = 2; 
    *ptr = 5;  
    printfn("%d",*ptr); 
    free(ptr); 
} 

另外,您可以为我和* PTR分配线使用类似:

int main(void) { 
    int i; 
    int * ptr; 

    i = 2; 
    ptr = &i;  
    printfn("%d",*ptr); // should print 2 
} 

还要注意的是免费的就出来了!

1

你声明ptr,但没有指向任何东西。然后你试图写出它指向的内容。这绝不是一个好主意。试着做PTR点我加入行

ptr = &i; 

你尝试写入* PTR