【问题标题】:Warning: initialization makes pointer from integer without a cast(integer pointers)警告:初始化从没有强制转换的整数生成指针(整数指针)
【发布时间】:2016-03-19 14:29:19
【问题描述】:

我有这段代码尝试使用整数指针,并且在编译时警告初始化使指针从整数而不进行强制转换。 此外,编译后的 .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

【问题讨论】:

标签: c pointers


【解决方案1】:

您以实现定义的方式将整数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;
}

【讨论】:

    【解决方案2】:

    这个:

    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
    

    【讨论】:

      【解决方案3】:

      num2 是一个指针。所以它应该存储一个地址。您永远不能像 1 那样在其中存储任何 INTEGER VALUE。指针应该存储地址。它可以存储一个变量的地址。所以我用 num1 整数变量的地址初始化了你的 num2 ,现在你的代码可以工作了。如果您尝试初始化您的 num2 以摆脱垃圾值,您可以将 NULL 存储在 num2 中。但是请确保不要取消引用空指针(例如使用语句 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;
      }
      

      【讨论】:

      • 第二件事?没听懂你想说什么。你能详细说明一下吗
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 2015-10-19
      相关资源
      最近更新 更多