2015-11-20 4 views
1

Я массив следующей структурыошибка сериализации в C

typedef struct PATH{ 
    int server1; 
    int server2; 
    int weight; 
}PATH; 

Я сериализации его в строку, используя следующую функцию.

char* serialize(PATH** arr, int sz){ 

    char* buffer = calloc(50, sizeof(int)); 

    char* str = NULL; 

    for (int i = 0; i < sz ; ++i) 
    { 
     sprintf(str, "%d %d %d\n", arr[i]->server1, arr[i]->server2, arr[i]->weight); 
     strcat(buffer, str); 

    } 

    return buffer; 
} 

И затем попытка распечатать его в главном, используя следующие две строки кода.

char* msg = serialize(paths, vector->numEdges); 
printf("%s\n", msg); 

В результате я обнаружил ошибку сегментации.

+0

несколько проблем с кодом: 1) 'str' указатель никогда не устанавливается, чтобы указать на какой-либо конкретной памяти, так что любая ссылка на' где str' точек неопределенное поведение и может привести к событию сбоя seg. 2) вызов 'sprintf()' не помещает байт завершения строки NUL в конец используемой части массива, поэтому 'strcat()' не знает, где остановить копирование символов. который является неопределенным поведением и может привести к событию сбоя seg. – user3629249

+0

почему двойной указатель и т. Д. Для переданного параметра: 'arr', если' arr' не является указателем на массив указателей (опубликованный код и текст вопроса не делают эту информацию ясной.) – user3629249

ответ

3
char* str = NULL; 

for (int i = 0; i < sz ; ++i) 
{ 
    sprintf(str, "%d %d %d\n", arr[i]->server1, arr[i]->server2, arr[i]->weight); 
    strcat(buffer, str); 

Когда вы звоните sprintf, вы просите его, чтобы сохранить результаты в str, но str не указывает ни на что.

также:

char* buffer = calloc(50, sizeof(int)); 

Почему вы используете sizeof(int), когда буфер хранит текстовые цифры, а не целые числа?

Вы, вероятно, хотите что-то вроде:

char* serialize(PATH** arr, int sz){ 

    char* buffer = malloc(sz * 50); 
    buffer[0] = 0; 

    char str[64]; 

    for (int i = 0; i < sz ; ++i) 
    { 
     sprintf(str, "%d %d %d\n", arr[i]->server1, arr[i]->server2, arr[i]->weight); 
     strcat(buffer, str); 
    } 

    return buffer; 
} 
+0

Не следует использовать 'snprintf()', и есть ли какое-либо преимущество для промежуточного массива, особенно когда этот массив больше, чем выделенный буфер? –

+0

@JonathanLeffler Я просто стараюсь держать вещи простыми. –

Смежные вопросы