C数组指针地址分配

时间:2018-06-01 17:14:51

标签: c arrays pointers

#define MAX_LINES 20
#define MAX_LINE 20

int main(){

    char *lines[MAX_LINES];
    for(int i=0;i<MAX_LINES;i++){

            char line[MAX_LINE];
            lines[MAX_LINES+i]=line;

    }
}

我很困惑为什么我的指针阵列&#34; line&#34; &#34; line&#34;&#34; line&#34;&#34; line&#34;地址已分配给它。为什么这项任务不起作用?

3 个答案:

答案 0 :(得分:2)

在您的代码中

lines[MAX_LINES+i]=line;

是纯undefined behaviour,你试图访问数组越界。

lines的有效索引为0MAX_LINES -1

那就是说,根据你的代码,line具有循环体的范围,在范围之外,它变得无效。如果您尝试访问循环外部lines数组成员指向的内存,则会调用未定义的行为。

答案 1 :(得分:2)

您在数组中分配了错误的索引,并且当您需要使用它时,您分配的内容将不存在,line变量超出范围。解决这个问题:

#define MAX_LINES 20
#define MAX_LINE 20

int main(){
  char *lines[MAX_LINES];

  for(int i=0;i<MAX_LINES;i++){
    lines[i] = malloc(MAX_LINE);
  }

  return 0;
}

虽然你当然应该总是free你原则上分配的任何东西,所以写一个函数来分配lines以及释放它是最好的方法。

答案 2 :(得分:0)

正如其他答案所解释的那样,您正在访问数组越界,并且您正在分配范围仅为for循环的地址。

来到问题的主要部分&#34; 为什么我的指针数组&#34; line&#34; &#34; line&#34;&#34; line&#34;&#34; line&#34;地址已分配给它。为什么该作业不起作用?&#34;

这里即使您将索引值更正为&#34; lines [i] = line;&#34;,它也不会起作用,因为您为每个字符指针分配了相同的地址。这是因为&#34; line&#34;是一个字符数组,字符数组的名称始终指向数组的基数。 如果您只想尝试分配操作,请试试这个。

int main(){

char *lines[MAX_LINES];
char line[MAX_LINES];

for(int i=0;i<MAX_LINES;i++)
{
        lines[i]=&line[i];
}