Здравствуйте, мне нужна помощь для понимания массивов символов sprintf и C. Я пришел из Java и понимаю C до указателей (я учил себя C: /).
В любом случае, я получаю ошибку segfault при использовании sprintf, и мне нужно ответить на пару вопросов.
1) Перезаписывает ли sprintf другие элементы в массиве символов? Если это так, не следует ли устанавливать первый элемент в 0 исправить это?
2) Будет ли массив символов, исчерпывающий пространство для размещения элементов, квалифицироваться как сегмент-ошибка?
char buffer[15];
char dbuff[15];
char* numer;//these variables don't cause the problem,
// but just thought I'd include them
char* denom;
char** num_ptr = &numer;
char** denom_ptr = &denom;
for(j=1; j < nR; j++)
{
for(i=1;i < nC; i++)
{
sprintf(buffer,"%i",sorts[j][i]); //problems after 1 loop
printf("buffer %s",buffer);
sprintf(dbuff,"%f",srcMat[j][i]);
// a new incoming rank
if(g_hash_table_lookup(rankCnt,buffer) == NULL)
{
avgholder[k++] = sorts[j][i];
printf("%i kkkk %i sorts\n",k,sorts[j][i]);
g_hash_table_insert(rankAvg,buffer,dbuff); //problem occurs here
g_hash_table_insert(rankCnt,buffer, (void*)1);
}
}
То, что я пробовал: добавление buffer / dbuff [0] = 0, memset и несколько других методов, но я забыл :(. Я думаю, что мне нужно выделить память, но я никогда этого не делал, будет ли это работать Кроме того, в основном я читаю файл с двухмерной матрицей, сортирую его по сортировке и использую хеш-карту glib, чтобы отобразить их для выполнения матричных манипуляций. Любая помощь была бы полезной!
Программа получила сигнал SIGSEGV, Ошибка сегментации.
0x0023af03 в ?? () из /lib/i386-linux-gnu/libc.so.6
(GDB) обратный ход
0x0023af03 в ?? () из /lib/i386-linux-gnu/libc.so.6
0x00238850 в strtod () из /lib/i386-linux-gnu/libc.so.6
0x00000000 в ?? ()
* РЕДАКТИРОВАТЬ извините, но я не думал, что инициализация массива была проблемой. Для srcMat это double srcMat[nR][nC]
, где nR и nC - это целые числа, которые являются строкой и столбцами.
для родов я использовал int sorts[nR][nC]
; и оттуда я заполняю его целочисленными значениями на основе ранжирования столбца матрицы.
GHashTable* rankAvg= g_hash_table_new(g_str_hash, g_str_equal);
GHashTable* rankCnt = g_hash_table_new(g_str_hash, g_str_equal);
Спасибо за помощь, ребята.
Кроме того, причина, по которой я начинаю с 1, а не с 0, заключается в том, что входной матричный файл содержит строку заголовка и столбцы заголовка - две вещи, которые не нужны для нормализации моего квантиля матрицы.
Также немного не по теме, но общий вопрос, у меня проблемы с приведением gpointers обратно в double (я могу привести в int), поэтому сейчас я просто храню элементы как строки и просто atof (double), когда я нужно их. Есть мысли по этому поводу?
РЕДАКТИРОВАТЬ # 2
Извините, ребята, но я только сузил проблему, на самом деле проблема возникает в методе вставки ghashtable, я прошёл 1 итерацию цикла, а на второй вставка вызывает ошибку segfault.