Неинициализированное условие Valgrind

#c #initialization #structure #valgrind

#c #инициализация #структура #valgrind

Вопрос:

После запуска следующей C-программы с Valgrind она сообщает packets.payload , что переменная неинициализирована. Но я не могу понять, почему, поскольку я уже ввел «1234567890» в packets.payload

 #include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct packet {
    int payload_length;
    char payload[10];
} packet_t;


int main () {
    packet_t packet;
    strncpy(packet.payload, "1234567890", 10);
    puts(packet.payload);
}
 

Ответ №1:

Необходимо передать указатель на строку (последовательность символов, заканчивающуюся нулевым символом) puts() .

Ваш packet.payload не содержит завершающего нулевого символа, поэтому вы не можете использовать его для puts() .

Вы можете использовать printf() с указанием длины для печати, чтобы распечатать это:

 printf("%.*sn", 10, packet.payload);
 

Ответ №2:

packet_t packet ={0, "0000000"} является инициализацией. В коде вы просто присваиваете значение, а не инициализируете. Инициализация переменной обеспечивает ее начальное значение во время построения (определения).