C - 初始化指针抛出关于 nullptr 的异常
C - initialized pointer throws exception about nullptr
我有一个代码打算使用函数使用指针找到最小值。
问题是,即使我在调试时初始化指针,它也会显示:
Exception thrown: read access violation.
min was 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 <= 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 指出我的错误
我有一个代码打算使用函数使用指针找到最小值。 问题是,即使我在调试时初始化指针,它也会显示:
Exception thrown: read access violation. min was 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 <= 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 指出我的错误