You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,直接触发空指针错误。

修正步骤

  1. 修正结构体定义:将指针数组改为字符数组,用于直接存储字符串:
struct persona
{
    char nome[30];    // 最多存储29个字符+字符串结束符
    char cognome[30];
};
  1. 修正scanf_s调用:
    • 去掉&,直接传递数组名(即字符串首地址);
    • 补充缓冲区大小参数,用(unsigned)_countof(数组名)或直接写30(需转为unsigned类型)。
      示例:
scanf_s("%s", lista_nomi[e].nome, (unsigned)_countof(lista_nomi[e].nome));
  1. 完善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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:45:17