【问题标题】:Comparing int and int* in C比较 C 中的 int 和 int*
【发布时间】:2022-01-24 23:44:09
【问题描述】:

我刚开始使用 C,我有些困惑。举个例子:

    int *first=0;
    int second=1;
    if(*first<second)
    {
        printf("Works\n");
    }

上面的例子应该给我打印并完成代码。 相反,它给了我一个段错误,但 IDE 告诉我没有问题。 首先,我不是给出指针指向的值吗? 我在这里错过了什么?

【问题讨论】:

  • *first 确实是 first 指向的任何值——如果它指向任何东西。
  • “首先,我不是给出了指针指向的值吗?”用您自己的话来说,您认为指针指向什么值?为什么你认为它指向任何特定的价值?当你写int *first=0;——尤其是=0部分时,你认为这意味着什么?
  • "我刚开始使用 C,我有点困惑" 如果您有基本的概念上的困难,那么您应该尝试遵循教程,或通读 FAQ,或获取教科书,或与导师交谈。 Stack Overflow 用于解决具体的代码问题。
  • "示例应该给我打印并完成代码。"是不正确的。代码在int *first=0; ... *first 被破坏。
  • 感谢 cmets。总的来说,我也不懂一些基本的在线内容,所以我去了下一个最好的东西。虽然 Stack Overflow 是针对具体问题的,但也有很多学生来这里寻找答案,所以嘿,也许他们像我一样误解了课程。最好是在网上提出一个具体问题,然后什么都没有:)我现在看到我给出的示例由于=0 部分而具有问题,但它通常是任何数字。

标签: c pointers integer


【解决方案1】:

int *first=0; 中,0 初始化first,而不是*first。也就是说,它将指针设置为 0(制作 空指针)。空指针不指向任何对象。

C 标准没有定义尝试使用空指针访问对象的行为,因此没有定义*first&lt;second 的行为。一个常见的结果是程序试图访问地址 0,并且进程的虚拟内存被配置,所以这会导致产生硬件异常,程序被终止。

(但是,编译期间的程序优化也可能会将使用空指针的尝试转换为其他代码,导致您的程序以神秘的方式运行,直到您熟悉优化的效果。)

要解决此问题,您需要将first 设置为指向正确的对象。您可以通过使其指向其他命名对象来做到这一点,例如:

int x;
int *first = &x;

或者为它分配内存:

int *first = malloc(sizeof *first);
if (!first)
{
    fprintf(stderr, "Error, failed to allocate memory.\n");
    exit(EXIT_FAILURE);
}

如果你分配了内存,那么你通常希望在程序中稍后释放它,使用free(first),在你完成使用它之后。

【讨论】:

  • 非常感谢您的丰富解释!现在我的代码工作了并且我明白我在做什么!我还确保将此作为正确答案,以防任何其他新手遇到同样的问题。
【解决方案2】:

看看你的代码

    int *first=0;
    int second=1;
    if(*first<second)
    {
        printf("Works\n");
    }

first 是一个指向int 的指针,它指向地址 0(即空指针)。因此,不允许读取地址 0 处的内存,因为它不指向任何有效对象,这会产生 segfault。所以,你需要给指针一个有效的地址。

相反,您可以尝试为指针提供包含值 0 的变量的有效地址

像这样...

    int x = 0;
    int* first = &x;
    int second = 1;
    if(*first < second)
    {
        printf("Works\n");
    }

【讨论】:

    【解决方案3】:

    使用int *first=0,您将 [first] 声明为指针并将 该指针 的值初始化为 0。从那时起,[first] 指向第 0 个内存位置,即没有错误。但是,在这个阶段(从内存地址 = 0 读取)是不允许取消引用指针的。

    【讨论】:

      【解决方案4】:

      试试这个

      int *first=(int*)malloc(sizeof(int));//allocate a pointer of type int
      *first=0;//initialize *first with 0
      int second=1;
      if(*first<second)
      {
          printf("Works\n");
      }
      

      【讨论】:

      • 没有解释的代码不是一个好的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 2020-10-15
      相关资源
      最近更新 更多