0

我无法将此字符串复制到列表中的一个数组,并且程序在到达该行时崩溃。你能帮忙解决这个问题吗?谢谢你。

这是代码。

typedef struct pedido pedido, *ppedido;

struct pedido{
    char id[5];
    int prioridade;
    int mesa, n_pratos;
    pprato prato[TAM];
    ppedido prox;
};

struct prato{
    char id[5];
};


ppedido AdicionaPratoMenu(ppedido lista, char ped[],char idprato[])
{
    int i,j=0,m=0;

    while(lista != NULL){
        if((strcmp(lista->id, ped)) == 0)
        {
            for(i=0;i<lista->n_pratos;i++)
            {
                m++;
            }

            strcpy(lista->prato[m]->id,idprato);   //This is where it goes wrong

        }
        lista=lista->prox;
    }

    return lista;
}
4

4 回答 4

1

如果出现以下情况,这是一个潜在的越界访问TAM == lista->n_pratos

strcpy(lista->prato[m]->id,idprato);

因为前一个for循环只会以TAM == m(C 中的数组索引从 0 开始)结束。要更正,请确保m < TAM在调用之前strcpy()

于 2012-06-25T08:32:54.893 回答
1

我假设您忽略了在此处包含以下内容:

typedef struct prato pprato; 

有两个潜在的问题:

  1. 什么strlen(idprato)等于?我的猜测是它是 5 或更大。
    改为使用strncpy(lista->prato[m]->id, idprato, 4);
  2. m一定比TAM你做的时候少strcpy。当你m在你的 for 循环中递增时,你还应该添加m < TAM,或者只使用这个循环: for (m = 0; m<lista->n_pratos; m++);

一般提示:始终使用strncmp代替strcmp; 而strncpy不是strcpy. 即使idprato总是有 4 的长度。

于 2012-06-25T08:26:29.903 回答
0

你需要检查

  1. 在,lista->prato[m]“m”小于“TAM”pprato prato[TAM];
  2. 长度idprato小于 5(这是您定义的)。
于 2012-06-25T08:32:28.360 回答
0

我假设'pprato'是一个指向'struct prato'的指针。如果是这样,你有一个指向“struct prato”的指针数组,但实际上没有为它们分配内存,然后你试图在你的 strcpy() 中取消引用它们。

于 2012-06-25T08:32:46.737 回答