将int赋给指针,会发生什么?

时间:2017-02-14 08:58:26

标签: c pointers

而不是像这样初始化指针,

int main (){
    int *ptr;
    int x = 5;
    ptr = &x;
}

当你做这样的事情时,记忆会发生什么?

int main (){
    int *ptr = 100;
}

* ptr会查找包含值100的随机地址,还是在ptr中存储值100?

6 个答案:

答案 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);