C语言struct、pointer、scanf_s报错求助(错误码C6011/C6064/C6067)
问题分析与解决方案
核心错误点
- 结构体成员定义错误:你在
struct persona里把nome和cognome定义成了char* [30](指针数组),但实际需要的是存储字符串的字符数组。指针数组的每个元素都是未初始化的空指针,直接写入会触发**C6011(解引用空指针)**错误。 - scanf_s使用不当:
- 参数传递错误:字符数组名本身就是首地址,不需要加
&,你传&lista_nomi[e].nome相当于传递了指针数组的地址,类型不匹配,触发C6064(缺少格式字符串所需的参数)和C6067(参数类型与格式字符串不匹配)。 - scanf_s要求为
%s格式指定缓冲区大小,这是它和scanf的关键区别,必须补充该参数避免越界。
- 参数传递错误:字符数组名本身就是首地址,不需要加
- malloc失败未终止程序:如果malloc返回NULL,后续代码仍会访问
lista_nomi,直接触发空指针错误。
修正步骤
- 修正结构体定义:将指针数组改为字符数组,用于直接存储字符串:
struct persona { char nome[30]; // 最多存储29个字符+字符串结束符 char cognome[30]; };
- 修正scanf_s调用:
- 去掉
&,直接传递数组名(即字符串首地址); - 补充缓冲区大小参数,用
(unsigned)_countof(数组名)或直接写30(需转为unsigned类型)。
示例:
- 去掉
scanf_s("%s", lista_nomi[e].nome, (unsigned)_countof(lista_nomi[e].nome));
- 完善malloc错误处理:malloc失败后,打印错误并立即退出程序,避免后续非法访问:
if (lista_nomi == NULL) { printf("Errore nell' inizializzazione dell'array lista_nome\n"); return 1; // 非0返回值表示程序异常退出 }
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #define MAX_PEOPLE 100 struct persona { char nome[30]; char cognome[30]; }; typedef struct persona Persona; int main(void) { int i; do { printf("Inserisci numero di persone da registrare!\n->"); scanf_s("%d", &i); if (i <= 0 || i > MAX_PEOPLE) { printf("Numero inserito non valido.\nRANGE -> [1 to %d]\n", MAX_PEOPLE); } } while (i <= 0 || i > MAX_PEOPLE); Persona * lista_nomi = (Persona *) malloc(i * sizeof(Persona)); if (lista_nomi == NULL) { printf("Errore nell' inizializzazione dell'array lista_nome\n"); return 1; } // Inserimento dei nomi e cognomi for (int e = 0; e < i; e++) { printf("\nInserisci %d persona\n", e + 1); printf("\tInserisci Nome -> "); scanf_s("%s", lista_nomi[e].nome, (unsigned)_countof(lista_nomi[e].nome)); printf("\tInserisci Cognome -> "); scanf_s("%s", lista_nomi[e].cognome, (unsigned)_countof(lista_nomi[e].cognome)); } // Stampa dei dati for (int j = 0; j < i; j++) { printf("Elemento %d -> %s %s\n", j + 1, lista_nomi[j].nome, lista_nomi[j].cognome); } free(lista_nomi); return 0; }
额外说明
- 若确实需要动态分配字符串长度,需先为每个
nome和cognome指针单独malloc内存,但对于初学者,固定大小的字符数组更简单安全。 _countof是微软编译器专属宏,用于获取数组元素个数;若使用其他编译器,可直接写30(数组定义的大小)。
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

