gpt4 book ai didi

c - 将指针传递给函数会导致在 C 中读取无法访问的地址

转载 作者:太空宇宙 更新时间:2023-11-04 06:37:22 24 4
gpt4 key购买 nike

我有一个程序,我在其中使用 malloc 动态分配内存;这是重要的部分:

unsigned int *hours;
unsigned int *minutes;
hours = (unsigned int *) malloc(n * sizeof(*hours));
minutes = (unsigned int *) malloc(n * sizeof(*minutes));

在此之后,我有一个 for 循环,循环 n 次;每次读取时间并在小时 [i] 中存储小时,在分钟 [i] 中存储分钟; for (i = 0; i < n; i++)

我在分配之前读取了 n :

scanf(%d, &n);

接下来,我有一个函数,它有 3 个参数,它看起来像这样:

void convertToMinutes(unsigned int *hours[],unsigned int *minutes[],int n)
{
unsigned int i;
for (i = 0; i < n; i++)
{
*minutes[i] =*hours[i]*60 + *minutes[i];
}
}

这是导致程序崩溃的部分。我正在使用 Dr. Memory 看看会发生什么,这里是转储:

Error #1: UNADDRESSABLE ACCESS: reading 0x00000005-0x00000009 4 byte(s)
# 0 convertToMinutes
# 1 main
Note: @0:00:11.408 in thread 1740
Note: instruction: mov (%eax) -> %ecx

如您所见,它会尝试读取 0x00000005 处的地址,这会导致 Windows 将其关闭。

所以在调用这个函数之前,我查看了小时和分钟数组的地址,这是我发现的:

for n = 3
hours base 10948584
hours+1 10948588
hours+2 19848592
minutes base 10948608
minutes+1 10948612
minutes+2 10948616

(地址转换为int)

我迷路了。我不知道出了什么问题。指针对我来说是新的(我已经使用它们几天了)而且我不知道为什么它突然尝试在禁止的地址读取。我做错了什么?

最佳答案

此函数签名采用的参数是指向无符号整数的指针数组

void convertToMinutes(unsigned int *hours[],unsigned int *minutes[],int n)

但您的数组是 unsigned int 而非 unsigned int * 的数组。尝试将其更改为

 void convertToMinutes(unsigned int hours[],unsigned int minutes[],int n)

或者(因为数组参数无论如何都会衰减为指针)甚至

void convertToMinutes(unsigned int* hours,unsigned int* minutes,int n)

函数内部删除取消引用并更改为:

 for (i = 0; i < n; i++)
{
minutes[i] = hours[i]*60 + minutes[i];
}

关于c - 将指针传递给函数会导致在 C 中读取无法访问的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13208439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com