我很困惑。在阅读this和this为什么命令行参数声明导致分段错误
我决定给它一个尝试,所以我坐下来写一个看起来像这样的
#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[])
后,我成功运行的代码不命令行申报的习惯第一次。 (这让我很惊讶)。我添加了命令行参数声明。
但是,这次运行相同的代码。导致分割错误。
问题:那么为什么这种区别,代码工作没有命令行参数,但与命令行参数声明断开。
这些问题是完全无关的。挑一个,或将它们分成不同的问题。 – rici
一个提示:'int * ptr = y'与'int ptr;'相同,后跟(1)'ptr = y;'或(2)'* ptr = y;'?这两项任务有什么区别? – rici
当ptr指针未初始化时,'* ptr = 65'是一个未定义的行为。你的问题最好的部分是试图定义未定义的,这是完全没有意义的。 – Ari0nhh