2017-03-07 133 views
0

我很困惑。在阅读thisthis为什么命令行参数声明导致分段错误

我决定给它一个尝试,所以我坐下来写一个看起来像这样的

#include <stdio.h> 
int main() 
{ 

    int *ptr; 
    printf("%p\n:",ptr); 
    *ptr = 65; 
    printf("PTR : \n \t VALUE: %d\n \t ADDRESS: %p\n",*ptr,ptr); 
    return 0; 
} 

香草代码和它的工作。

0x7fff50ba0500 
:PTR : 
    VALUE: 65 
    ADDRESS: 0x7fff50ba0500 

现在,我有几个问题(确切地说是3)。

问题1:

我知道int *ptr未在上面的步骤初始化。其中一种方法是使用。

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

    or 
int b = 65; 
int *ptr; 
ptr = &b; // or simply int *ptr = &b; 

但与char指针不同,它不能直接赋值。在字符指针世界

char *name = "apple"; 
    or 
    char *name; 
    name = "viren"; 

例子是一个有效的声明,但下面是不正确的另一个例子

int *ptr = 65; // not valid, since ptr should point to address. 

这个原因作出任何解释?

问题2

正如在其他堆栈溢出回答

*ptr = 65; 

一提的是不好的,因为PTR必须指向一个地址。在上述情况下,它会指向0x41地址(如果转换为十六进制是正确的),因此该代码将导致segmentation fault

问那么为什么上面的代码休息,导致Segmentation Fault

问题3: 我没有写在命令行参数声明即

int main(int argc,char *argv[]) 

后,我成功运行的代码命令行申报的习惯第一次。 (这让我很惊讶)。我添加了命令行参数声明。

但是,这次运行相同的代码。导致分割错误。

问题:那么为什么这种区别,代码工作没有命令行参数,但与命令行参数声明断开。

+1

这些问题是完全无关的。挑一个,或将它们分成不同的问题。 – rici

+0

一个提示:'int * ptr = y'与'int ptr;'相同,后跟(1)'ptr = y;'或(2)'* ptr = y;'?这两项任务有什么区别? – rici

+1

当ptr指针未初始化时,'* ptr = 65'是一个未定义的行为。你的问题最好的部分是试图定义未定义的,这是完全没有意义的。 – Ari0nhh

回答

2

答1

当你做char *name = "apple";,你指定name是一个字符指针指向一个字符串对象“苹果”。在C中,字符串文字存储在内存的特殊(只读)部分。因此name在这里指向存储文字“apple”的那部分内存。

但是,整型或浮点型文本通常是机器指令的一部分,不会单独存储在内存中。因此,您的陈述int * p = 65变得无效,因为整数字面值65没有单独存储在内存中,因此没有int指针可指向的地址。

答2

你的理解是不完全正确的。语句*ptr = 65指示65的int值应存储在ptr指向的地址处。在你的情况下,由于你没有用可写内存初始化ptr,它会引发分段错误。

答3

指定参数给main功能不应该有什么关系,你所看到的分段错误。将值分配给未初始化的指针的行为是不可预知的。它可能会引发分段错误,或者它可能不取决于它最终写入的内存位置是否可写。

相关问题