我有一个程序,在那里,我使用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++)
我在分配之前使用:
读取nscanf(%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)
我输了。我不知道出了什么问题。指针对我来说是新的(我已经使用它们几天了)我不知道它为什么突然试图阅读禁止的地址。我做错了什么?
答案 0 :(得分:3)
此函数签名采用pointer
到unsigned 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];
}
答案 1 :(得分:1)
我猜你打算用hours
和minutes
作为整数数组。在这种情况下,您的分配应该类似于
hours = (unsigned int *) malloc(n * sizeof(hours));
但绝对不会导致崩溃。我认为问题在于您将参数传递给函数并访问它们的方式。
以下可能是您想要做的。
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);
}
}
对于数组arr [4]将等于*(arr + 4) 您可以阅读here。