【发布时间】:2017-07-27 04:04:51
【问题描述】:
我决定试一试,所以我坐下来写了一个看起来像这样的原版代码
#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 指针世界中的示例
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[])
在我第一次成功运行代码没有命令行声明之后。 (令我惊讶的是,它取得了成功)。我添加了命令行参数声明。
但是,这次运行相同的代码。导致分段错误。
问题:那么为什么代码在没有命令行参数的情况下工作但与命令行参数声明中断。
【问题讨论】:
-
这些问题完全不相关。选择一个,或将它们分成不同的问题。
-
一个提示:
int * ptr = y与int ptr;相同,后跟 (1)ptr = y;或 (2)*ptr = y;?这两个作业有什么区别? -
*ptr = 65当ptr指针未初始化时是未定义的行为。您问题中最好的部分是尝试定义未定义,这完全没有意义。