0

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

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

在此之后,我有一个 for 循环,循环 n 次;每次读取时间并在 hours[i] 存储小时,在 minutes[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)

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

4

2 回答 2

3

此函数签名接受的参数是pointerunsigned int的数组

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

但是您的数组是unsigned intnot的数组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];
 }
于 2012-11-03T10:54:57.847 回答
1

我猜你打算使用hoursminutes作为整数数组。在这种情况下,您的分配应该类似于

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) 你可以在这里阅读。

于 2012-11-03T11:01:26.313 回答