而不是像这样初始化指针,
int main (){
int *ptr;
int x = 5;
ptr = &x;
}
当你做这样的事情时,记忆会发生什么?
int main (){
int *ptr = 100;
}
* ptr会查找包含值100的随机地址,还是在ptr中存储值100?
答案 0 :(得分:3)
这是约束违规,编译器应该为您提供诊断消息。 (如果编译器没有说"错误"那么我建议改变编译器标志,以便它可以)。如果编译器仍然生成可执行文件,那么该可执行文件的行为是未定义的。
在标准C中,此代码不为指针指定100,正如其他几条评论/答案所声称的那样。除了常量表达式为零的特殊情况外,不能将整数分配给指针(即使用右侧的赋值运算符或带整数的初始化语法)。
要尝试将指针指向地址100,代码将为int *ptr = (int *)100;
。
答案 1 :(得分:2)
首先,正如其他答案中所提到的,代码int *ptr = 100;
甚至不是有效的C.为指针赋一个整数不是简单赋值的有效形式(6.5.16.1)所以代码是一个所谓的“约束违规”,意味着它是C标准违规。
因此,您的第一个问题需要成为您的编译器不遵循标准的原因。如果您正在使用gcc,请注意,遗憾的是,它默认情况下未配置为符合标准的编译器,您必须通过-std=c11 -pedantic-errors
告诉它成为一个编译器。
一旦对其进行排序,您可以通过显式转换将整数转换为指针类型,从而将代码修复为有效的C. int *ptr = (int*)100;
这意味着除了将地址100存储在指针变量中之外别无其他。没有尝试访问该内存位置。
如果您尝试通过例如*ptr = 0;
来访问该内存,那么确保100
是给定系统的对齐地址是您的职责。如果没有,则调用未定义的行为。
就C语言而言。 C不知道或不关心地址100中存储的内容。它不在语言范围内。在某些系统上,这可能是一个完全有效的地址,在其他系统上它可能是无稽之谈。
答案 2 :(得分:1)
int *ptr = (int*)100; // valid
int *ptr = 100; // invalid as int to int * cast is not automatic
不鼓励使用绝对地址,因为在可重定位的程序段中,您永远不会知道指针应该具有哪个地址的值,而应该指向有效的地址以避免意外。
答案 3 :(得分:0)
编译器不会给你任何错误。但这是违反约束的行为。指针变量存储其他变量的地址,*ptr
用于更改存储在该地址的值。
答案 4 :(得分:-1)
它的长短是没有。将值100
分配给指针值p
会有所作为;它将指针值的地址设置为100
,就像将调用值malloc
分配给它一样;但由于该值从未使用过,因此实际上并没有做任何事情。我们可以看看价值产生的结果:
/* file test.c */
#include <stdlib.h>
#include <stdio.h>
int main() {
int *ptr = (int *) 100;
printf("%p\n", ptr);
return 0;
}
执行此操作会产生此输出:
0x64
在某种意义上,指针只是一个整数。它们(有时)占用大小相同的整数(取决于平台),并且可以很容易地从整数转换。在C11中甚至还有一个特定的(可选)类型,用于与指针大小相同的整数:intptr_t
(参见What is the use of intptr_t?)。
回到这一点,尝试执行任何类型的此指针的任何解除引用都可能导致奇怪行为(tm) - 内存的布局依赖于平台和实现,因此尝试在地址{{ 1}}可能会导致分段错误(如果你很幸运):
100
在此输出中执行结果:
/* file test.c */
#include <stdlib.h>
#include <stdio.h>
int main() {
int *ptr = (int *) 100;
printf("%i\n", *ptr);
return 0;
}
除非你确切知道自己在做什么,以及为什么要这样做,否则不要这样做。
答案 5 :(得分:-2)
使用:
int *ptr = 100;
您已将值100
指定给指针。对它做任何事情但是打印它的值将是未定义的行为:
printf ("pointer value is %p\n", (void *)ptr);