#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;地址已分配给它。为什么这项任务不起作用?
答案 0 :(得分:2)
在您的代码中
lines[MAX_LINES+i]=line;
是纯undefined behaviour,你试图访问数组越界。
lines
的有效索引为0
到MAX_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];
}