strcat () вызывает segfault в c - PullRequest
0 голосов
/ 07 мая 2020

Ниже приведен небольшой фрагмент кода из более крупной программы, его цель - преобразовать 8 значений int64_t, которые сохраняются в значении массива [] структуры paramD6P12Array, в объединенную строку вида: "+0.000111111111, +0.000222222222 , +0.000333333333, ... "(числа являются лишь примерами).

Результат должен быть сохранен в строке, на которую указывает str, и я использовал другую строку nextParamValue для преобразования каждого отдельного значения массива в правое форматирование (с плюсом и десятичной точкой в ​​начале и конечной запятой и пробелом), которое затем объединяется с str.

Однако при запуске программы это вызывает ошибку сегментации, похоже, что проблема вызвана какой-то строчкой в ​​for l oop (когда я ее закомментирую, все работает нормально). Я новичок в программировании c и манипуляциях со строками и уже читал о строковых функциях strcat () и т. Д. Также я пробовал mallo c () и free (), но пока ничего не работало. Кроме того, при использовании mallo c () и free () ошибки сегментации не происходит, но программа просто кажется приостановленной, при переходе через отладчик я заметил, что приостановка происходит со строкой, где вызывается free ().

#define MAX_CMD_STRSIZE 128;

char str[MAX_CMD_STRSIZE];

PARAM_D6P12_ARRAY* paramD6P12Array = (PARAM_D6P12_ARRAY*)param;
int len;
size_t arraySize = sizeof(paramD6P12Array->value)/sizeof(paramD6P12Array->value[0]);


len = sprintf(str, "%+014"LLD_FMT_STR, paramD6P12Array->value[0]);
int DOT_INDEX = len - 12;
memmove(&str[DOT_INDEX + 1], &str[DOT_INDEX], len + 1 - DOT_INDEX);
str[DOT_INDEX] = '.';
int newLen;
for(int i = 1; i<(int)arraySize; i++){
     char* nextParamValue = (char*)malloc((len+3)*sizeof(char));
     newLen = sprintf(nextParamValue, ", %+014"LLD_FMT_STR, paramD6P12Array->value[i]);
     DOT_INDEX = newLen - (12+2);
     memmove(&nextParamValue[DOT_INDEX + 1 + 2], &nextParamValue[DOT_INDEX+2], len + 1 - DOT_INDEX);
     nextParamValue[DOT_INDEX+2] = '.';
     //memmove(&str[len+1], nextParamValue, newLen+1);
     strcat(&str[len], nextParamValue);
     len += newLen;
     }
     free(nextParamValue);
} 
...