Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中整数指针的常量值赋值适用于这种情况_C_Pointers - Fatal编程技术网

C中整数指针的常量值赋值适用于这种情况

C中整数指针的常量值赋值适用于这种情况,c,pointers,C,Pointers,我得到了一个令人惊讶的观察,下面的代码出现了分段错误 #include<stdio.h> void main() { int *i; *i = 100; printf("%u\n",i); printf("%d\n",*i); } 但不是下面这个 #include<stdio.h> void main() { char* str; int *i; *i=100; str = "Hello"; pri

我得到了一个令人惊讶的观察,下面的代码出现了分段错误

#include<stdio.h>
void main() {
    int *i;
    *i = 100;
    printf("%u\n",i);
    printf("%d\n",*i);
}
但不是下面这个

#include<stdio.h>
void main() {
    char* str;
    int *i;
    *i=100;
    str = "Hello";
    printf("%u\n",i);
    printf("%s %d\n",str,*i);
}
有人能解释一下这种行为吗?我使用的是gcc。

首先,这两个代码段都是由于取消了对未初始化指针I的引用而导致的

在第一种情况下,您试图取消对未初始化指针i的引用,因此这是未定义的行为

你在干什么

 *i = 100;
但是想想,我指的是什么?可能是到某个进程无法访问的内存位置,因此这是无效的内存访问。这会触发UB

第二段也一样

但是,如果您从第二个代码段中删除i的用法,就可以了

在建议的更改之后,在第二个代码段中,您将字符串文本的起始地址存储到指针变量中,即分配它。所以,这是完全可以的

对于这样的陈述

  str = "Hello";
这里您并不是在尊重str,而是给str分配一个指针值,这是非常好的

也就是说

根据C标准,对于托管环境,void main不是一致性签名,至少必须使用int mainvoid。 像printf%u\n,i;还以自己的方式调用未定义的行为。如果要打印指针,必须使用%p格式说明符并将参数强制转换为void*。
由于以下原因,您的两个程序都将导致未定义的行为。因此无法获得正确的结果

1取消引用未初始化指针*i=100;是未定义的行为。在这两个示例中,都是在初始化指针i之前取消对它的引用。因此,首先使用&运算符初始化指针,然后在代码中使用它


2使用转换说明符打印指针值,用于无符号字符串。您应该改为使用%p。

i尚未初始化为指向任何特定的内存位置,因此它不是有效的指针值。试图通过无效指针进行写入会导致未定义的行为,这意味着结果可能是任何东西—您的代码可能会彻底崩溃,可能会损坏数据,可能输出有误,或者可能看起来工作没有问题

这是一种未定义的行为,没有理由去推理吗?我运行了好几次,即使我认为是这样,但每次我都得到了正确的答案。那是我在这里提出的?真的是这样吗???@Bathsheba什么是UB?int*i指的是哪里?您应该首先使用&或NULL初始化它以指向某个变量地址,否则您将有未定义的beahvior在第二个代码段中,他仍然使用内存不可用的i变量initialized@J...S好的,让我重新表述一下答案。@Sourav顺便问一下,什么是UB?我不是这里的普通追随者,所以不知道所有术语…@user3345621 UB->未定义行为。