Спринтф для цикла Segfault - PullRequest
1 голос
/ 12 июля 2011

Здравствуйте, мне нужна помощь для понимания массивов символов 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.

Ответы [ 3 ]

1 голос
/ 12 июля 2011

Недостаточно места в массиве, конечно, может вызвать ошибку - в зависимости от того, где находится массив в памяти.Но обратите внимание, каковы границы вашего массива: вы переходите от 1 до nR-1 или nC-1.C имеет 0 на основе массивов.Вы уверены, что делаете там, что хотите?

1 голос
/ 23 июля 2012

Боюсь, что в lib есть какая-то ошибка ... Я также столкнулся с какой-то странной ошибкой сегментации в какой-то конкретной программе Gtk + - я понятия не имею, в чем смысл, так как мне не удалось вернуть ошибку в моих тестах,Однако в моем случае ошибка сегментации возникает после того, как я выделил 24 * 64 байта размера памяти, где 24 - это размер структуры, а не точка - смысл в том, что ошибка возникает только тогда, когда она равна 64 -он отлично работает со всеми другими значениями - нет причины, почему 64 может быть единственным исключением!

Когда gdb отслеживает ошибку обратно в /lib/i386-linux-gnu/libc.so.6,тот же источник, что и в вашем вопросе - хотя они, вероятно, имеют разные причины - именно поэтому я нашел ваш вопрос здесь - я действительно не думаю, что это из-за моих кодов, ни вашего.

1 голос
/ 12 июля 2011

В C индексы массивов начинаются с 0, а не с 1. Попробуйте инициализировать i и j в циклах for с 0, возможно, вы обращаетесь к неправильной памяти, поэтому ошибка seg.

РЕДАКТИРОВАТЬ Что ж, если вы намеренно инициализируете его с 1, то вы должны зацикливаться на nR-1 и nC-1, чтобы не получить доступ к неправильной памяти.

РЕДАКТИРОВАТЬ2

Эта строка выглядит ОЧЕНЬ подозрительно:

g_hash_table_insert(rankCnt,buffer, (void*)1);

попробуйте объявить где-нибудь int, присвоив ему значение 1 и передав его в качестве параметра. Если это int, который вы должны передать ... какова сигнатура вызова этой функции?

int myint = 1;
g_hash_table_insert(rankCnt,buffer, &myint);
...