警告:初始化使得整数指针没有强制转换(整数指针)

时间:2016-03-19 14:29:19

标签: c pointers

我有这个代码尝试使用整数的指针,并且有一个初始化警告,在编译它时,指针来自整数而没有强制转换。 此外,似乎编译后.exe文件将无法正常运行。请帮忙!

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char* argv[]) {
    int num1=10, *num2=1;
    printf("num1=%d \t num2=%d \n", num1, *num2);
    *num2 = num1;
    printf("num1=%d \t num2=%d \n", num1, *num2);

    return 0;
}

Error message

3 个答案:

答案 0 :(得分:5)

您以实现定义的方式将整数1转换为指针,并且转换后的指针几乎没有机会成为有效指针。因此,取消引用指针并向其读取或写入某些值会产生很大的机会导致分段错误。

创建一个对象使指针指向,并使指针指向该对象。只有在那之后,使用指针读取或写入指向它的位置的值。

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char* argv[]) {
    int obj = 0; /* do initialize before using the value */
    int num1=10, *num2=&obj;
    printf("num1=%d \t num2=%d \n", num1, *num2);
    *num2 = num1;
    printf("num1=%d \t num2=%d \n", num1, *num2);

    return 0;
}

答案 1 :(得分:3)

此:

int num1=10, *num2=1;

相当于:

int num1 = 10;
int *num2 = 1;

第二个变量是指向int的指针,当您为其赋值或初始化它时,您可以指定一个地址。您不创建指向值为1的整数的指针。

这就是警告的含义:您正在将整数转换为指针,这通常是一个错误。

如果需要指向int的指针,则必须同时创建:

int num2 = 1;
int *pnum2 = &num2;     // pointer to num2, *num2 == 1

答案 2 :(得分:0)

num2是一个指针。所以它应该存储一个地址。你永远不能存储任何INTEGER VALUE,就像你所做的那样。指针应该存储一个地址。它可以存储变量的ADDRESS。所以我用num1整数变量的地址初始化你的num2,现在你的代码工作了。如果您尝试初始化num2以消除垃圾值,则可以在num2中存储NULL。但请确保您不取消引用空指针(如使用语句printf(* num2)),因为取消引用NULL指针是严重的运行时错误,分段错误。

#include <stdio.h>
#include <stdlib.h>

    int main(int argc, char* argv[]) {
    int num1=10, num2=&num1; //this is what i have changed in your code
    printf("num1=%d \t num2=%d \n", num1, *num2);
    *num2 = num1;
    printf("num1=%d \t num2=%d \n", num1, *num2);

    return 0;
}