Странное поведение указателя - PullRequest
0 голосов
/ 21 февраля 2011

Попытка запустить этот кусок кода:

void print_matrix(matrix* arg)
{
     int i, j;
     for(i = 0; i < arg->rows; i++) {
         for(j = 0; j < arg->columns; j++) {          // gdb shows, that arg->columns value
             printf("\n %f", arg->data[i][j]);        // has been changed in this line (was 
         }                                            // 3, is 0)
         printf("\n");
     }
}

matrix это структура:

typedef struct matrix_t 
{
    int rows;
    int columns;
    double** data;

} matrix;

Аргумент правильно распределен в матрице 3х3, строки = 3, столбцы = 3

Функция печатает только \ n's.

Компилятор gcc 4.5. Есть идеи?

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

int main()
{
    matrix arg;
    arg.rows = 3;
    arg.columns = 3;
    arg.data = (double**)malloc(sizeof(double*) * arg.rows);
    int i;
    for(i = 0; i < arg.rows; i++) {
       arg.data[i] = (double*)malloc(sizeof(double) * arg.columns);
    }

    arg.data[0][0] = 1; 
    arg.data[0][1] = 2;
    //......
    print_matrix(&arg);


    for(i = 0; i < arg.rows; i++) {
        free(arg.data[i]);
    }
    free(arg.data);

    return EXIT_SUCCESS;
}

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Как уже упоминалось в комментариях выше, похоже, ничего плохого в коде .Работает нормально, когда скомпилировано на моей машине и на IDEone.См. http://ideone.com/SoyQH

У меня было несколько свободных минут, поэтому я провел несколько дополнительных проверок.Это в значительной степени шаги, которые я предпринимаю перед каждой фиксацией кода или когда мне нужны некоторые подсказки при отладке.

Тестирование со строгими флагами компилятора

Компиляция с помощью gcc с использованием -Wall -pedantic было несколько предупреждений относительноНесовместимости ISO C90, но нет пробок для показа.

[me@home]$ gcc -Wall -pedantic -g k.c
k.c:17:55: warning: C++ style comments are not allowed in ISO C90
k.c:17:55: warning: (this will be reported only once per input file)
k.c: In function `main':
k.c:30: warning: ISO C90 forbids mixed declarations and code

Предупреждения, связанные с:

  • использованием комментариев в стиле C ++, то есть // вместо /* ... */
  • в main(), объявление int i; было смешано с кодом.C90 ожидает, что все объявления будут сделаны в начале.

Использование split

После устранения вышеприведенных предупреждений запустите splint -weak в коде.

[me@home]$ splint -weak k.c
Splint 3.1.1 --- 15 Jun 2004

Finished checking --- no warnings

Ничего не сообщать.

Valgrind

Valgrind подтверждает отсутствие утечек памяти, но жалуется на использование унифицированных значений в printf (не всем элементам в args->data были заданы значения).

[me@home]$ valgrind ./a.out
==5148== Memcheck, a memory error detector.
... <snip> ...
==5148==

 1.000000
 2.000000
==5148== Conditional jump or move depends on uninitialised value(s)
==5148==    at 0x63D6EC: __printf_fp (in /lib/tls/libc-2.3.4.so)
==5148==    by 0x63A6C4: vfprintf (in /lib/tls/libc-2.3.4.so)
==5148==    by 0x641DBF: printf (in /lib/tls/libc-2.3.4.so)
==5148==    by 0x804842A: print_matrix (k.c:18)
==5148==    by 0x8048562: main (k.c:42)
... <snip> ...
==5148==
==5148== ERROR SUMMARY: 135 errors from 15 contexts (suppressed: 12 from 1)
==5148== malloc/free: in use at exit: 0 bytes in 0 blocks.
==5148== malloc/free: 4 allocs, 4 frees, 84 bytes allocated.
==5148== For counts of detected errors, rerun with: -v
==5148== All heap blocks were freed -- no leaks are possible.

Заключение

Нечего сообщать.Двигаемся дальше.

1 голос
/ 21 февраля 2011

matrix.data - это дикий указатель. Вам нужно выделить память для матрицы и заставить data указать на нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...