【问题标题】:Void pointer to integer指向整数的无效指针
【发布时间】:2021-02-23 15:47:54
【问题描述】:

我有一个名为 printNums 的方法,我想打印从 1 到 10 的整数。对于我的分配,我应该分配一个 int 指针,设置它,作为 void* 点传递给我的函数,然后在函数内部,对其进行强制转换,尊重它并在计数器的每次迭代之前打印出该整数。

但是,在*((int*)ptr) 之后我不断收到分段错误,我不太清楚为什么。任何帮助将不胜感激。

这是我的代码:

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

void* printNums(void *ptr);

int main(int argc, char **argv)
{

  int *ptr = (int*)malloc(sizeof(int));
  ptr = 0;
  printNums(ptr);

  return 0;

}

void* printNums(void *ptr){

  int i = 0;

  for (i = 0; i <= 10; i++){

    *((int*)ptr) = i; 

    printf("%d\n", *((int*)ptr));

  } 

}

【问题讨论】:

  • printNums 应该返回一个值(void* 类型)
  • ptr = 0; - 在这里您将新分配的指针设置为NULL
  • int *ptr = (int*)malloc(sizeof(int)) 只为一个int 分配内存,这可能不是您想要的。
  • printNums 打印 10 次相同的数字。这是你的意图吗?也许你应该告诉我们程序应该做什么。

标签: c


【解决方案1】:

您将 ptr 指针分配为零。 将ptr = 0; 更改为*ptr = 0;。

【讨论】:

    【解决方案2】:

    您正在将地址重置为零:

    ptr = 0;
    

    这意味着如果您尝试访问它,您肯定会(在大多数环境和操作系统中)遇到分段错误。

    【讨论】:

      【解决方案3】:

      我认为您想将ptr指向的值设置为0才能使用,所以您错误地设置了ptr = 0

      要使ptr 指向的所有值都为0,您需要使用memset

      memset(ptr,0,sizeof(int));

      【讨论】:

        【解决方案4】:

        但是,在*((int*)ptr) 和 我不太清楚为什么。

        您可以尝试找出自己。编程需要一些调试技能 - 论坛不是替代品。

        void* printNums(void *ptr){
        
          int i = 0;
        
          for (i = 0; i <= 10; i++){
        
            printf("%p\n", ptr);
            //*((int*)ptr) = i; 
            //printf("%d\n", *((int*)ptr));
          } 
          return ptr;
        }
        

        https://godbolt.org/z/EYhGKn

        和输出

        (nil)
        (nil)
        (nil)
        (nil)
        (nil)
        (nil)
        (nil)
        (nil)
        (nil)
        (nil)
        (nil)
        

        答案很明显:你取消引用 NULL 指针。

        现在您可以尝试找出为什么将 NULL 指针传递给函数。由于该程序有 12 行长,因此不会花费太多时间来发现该行:

        ptr = 0;
        

        将整数零分配给指针。所以指针现在为 NULL。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-23
          • 2019-10-27
          • 1970-01-01
          • 2012-01-24
          • 1970-01-01
          • 1970-01-01
          • 2012-07-23
          • 2012-05-16
          相关资源
          最近更新 更多