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

时间:2012-11-03 10:49:09

标签: c pointers malloc

我有一个程序,在那里,我使用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)

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

2 个答案:

答案 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)

我猜你打算用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) 您可以阅读here