【问题标题】:C - initialized pointer throws exception about nullptrC - 初始化指针引发关于 nullptr 的异常
【发布时间】:2018-03-14 08:42:46
【问题描述】:

我有一个代码,它打算使用指针和函数来查找最小值。 问题是,即使我在调试时初始化了指针,它也显示:

抛出异常:读取访问冲突。 min 为 nullptr。

在第 37 行。代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"

int tab_min(const int* tab, int size, int *min);

int main()
{
    int limit;
    int tab[100];
    int * ptab = tab;
    int min = 2;
    int *pmin = &min;

    printf("Number of elements: ");
    scanf("%d", &limit);
    printf("List the elements \n");
    for (int i = 0; i < limit; i++)
    {
        scanf("%d", &*(ptab + i)); 
    }
    tab_min(ptab, limit, pmin);

    return 0;
}

int tab_min(const int* tab, int size, int *min) 
{

    if ((tab == NULL) || (size <= 0) || (min = NULL)) 
    {
        return 0; 
    }
    else 
    {
        for (int i = 0; i < size; i++)
        {
            if (*(tab + i) < *min) *min = *(tab + i); //Exception is here
        }
    return 0;
    }
}

有人可以向我解释一下我的推理有什么问题吗?

【问题讨论】:

  • if ((tab == NULL) || (size &lt;= 0) || (min = NULL)) 应该有一个==。您将min 设置为NULL
  • &amp;*(ptab + i) 应该是 ptab + i 为清楚起见。
  • 啊,我没注意,谢谢。
  • 在比较的左侧写入常数值NULL == min 是个好主意。这样这样的错字会导致编译时错误消息。
  • @Lundin 不,这是一种实用的方法,可以防止由不可预防的拼写错误引起的错误。过度依赖编译器警告是导致错误的直接途径。注意these warnings won't capture this problem in all context 和这些警告实际上是默认关闭的。

标签: c function pointers initialization null-pointer


【解决方案1】:

严重错误是 if ((tab == NULL) || (size &lt;= 0) || (min = NULL)) 将 var min 赋值为 NULL。

如果需要记录最小值,可以使用指针地址作为参数

int tab_min(const int* tab, int size, int **min);

if (*(tab + i) < **min) *min = (tab + i);

然后打电话

tab_min(ptab, limit, &pmin);

感谢@Gerhardh 指出我的错误

【讨论】:

  • 我认为你忽略了 *min = *(tab + i);无论你记录位置min都是错误的,因为min是2,*min是0x00000002,不能访问
  • 是的,我误会了
猜你喜欢
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
相关资源
最近更新 更多