在C中将一维数组推到二维数组上

在C中将一维数组推到二维数组上,c,pointers,arrays,struct,structure,C,Pointers,Arrays,Struct,Structure,我正在处理队列数据结构。结构如下: struct queue { char array[MAX_LENGTH][8]; int back; }; 它用于存储长度为7个字符的最大长度字符串列表。 我希望推送一个8个字符的1D数组(好吧,7个字符和\0,就像结构中的数组一样) 我有这个推码: void push (struct queue *q, char s[]){ q->array[q->back] = s; } 我想这可能行得通,但显然不行。在cl(.net的C/C++)

我正在处理队列数据结构。结构如下:

struct queue
{
 char array[MAX_LENGTH][8];
 int back;
};
它用于存储长度为7个字符的最大长度字符串列表。 我希望推送一个8个字符的1D数组(好吧,7个字符和\0,就像结构中的数组一样)

我有这个推码:

void push (struct queue *q, char s[]){
 q->array[q->back] = s;
}
我想这可能行得通,但显然不行。在cl(.net的C/C++)编译器中,我得到以下错误:

2.c(29):错误C2106:“=”:左操作数必须是l值

gcc在同一行上返回一个类似的错误(但我忘记了,目前无法访问gcc)

我对结构和指针相当陌生,所以可能有一些非常明显的事情我没有做。感谢您的帮助:)

将其更改为:

void push (struct queue *q, char s[])
{
    strcpy(q->array[q->back], s);
}

您可以使用
=
在C中分配结构,但不能分配数组-您必须使用strcpy/memcpy来处理类似的事情。

您必须像对待任何其他数组一样对待
q->array
。你不能只是“推”它,你必须传递你想要放置它的位置,然后复制每个字符(或者使用q->back作为你的位置)。也许是这样的:

void push (struct queue *q, char s[]){
  int i;
  for ( i = 0; s[i]; ++i ) 
    q->array[q->back][i] = s[i];
  q->array[q->back][i] = '\0'; 
}
或者使用strcpy

void push (struct queue *q, char s[]){
  strcpy(q->array[q->back], s);
}

strncpy(q->array[q->back],s,MAX_LENGTH)可以更好地避免缓冲区溢出

如果您只想使用标准C库函数检查边界,那么
strncpy
实际上是您最好的选择:

void push (struct queue *q, char s[])
{
    q->array[q->back][0] = 0;
    strncat(q->array[q->back], s, sizeof q->array[q->back] - 1);
}
另一方面,如果您确定
s
始终指向与结构中的数组大小相同的数组(如您的问题所述),则
memcpy
是最简单的解决方案:

void push (struct queue *q, char s[])
{
    memcpy(q->array[q->back], s, sizeof q->array[q->back]);
}

也许可以添加一些针对缓冲区溢出的检查?使用strncpy(),您必须确保空终止;没有。所以您还需要
q->array[q->back][7]='\0'。我们可以讨论strncpy()的最后一个参数是8(足够安全)还是7(因为您将要覆盖第8位…)。