2015-10-22 4 views
-1

Я передаю массив указателей на функцию и изменяю их, но они неожиданно меняются. Это моя основная функция:Передача массива указателей на функцию C

#include <stdlib.h> 
#include <stdio.h> 
typedef struct { 
    int x; 
    int y; 
}enemy; 

void main() { 
    enemy* array[5]; 
    function(array); 
} 

И это функция не работает:

void function(enemy* arr[]){ 
    int b; 
    for(b=0;b<5;b++) 
     arr[b]=(enemy*)malloc(sizeof(enemy)); 
    for(b=0;b<5;b++){ 
     arr[b]->x=b; 
     arr[b]->y=b*16; 
     printf("%d %d, ", arr[0]->x, arr[0]->y); 
    } 
} 

Каждый раз, когда я называю printf первый указатель массива изменяет свои значения, и я не знаю, почему ,

Отпечатки printf: «0 0, 1 16, 2 32, 3 48, 4 64». Должна ли она печатать все время «0 0»? Это то, чего я ожидал.

+0

и что такое 'maxEnemigosSala'? – wildplasser

+0

Его постоянная константа – Alex

+0

как вы можете изменить значение массива? покажите нам ваш printf или любой другой код – HuStmpHrrr

ответ

0

следующие является verison вашего кода, который я использовал для тестирования:

#include <stdlib.h> 
#include <stdio.h> 
typedef struct 
{ 
    int x; 
    int y; 
}enemy; 

void function(enemy* arr[]); 

int main(void) 
{ 
    enemy* array[5]; 
    function(array); 
} 

void function(enemy* arr[]) 
{ 
    int b; 
    for(b=0;b<5;b++) 
     arr[b]=(enemy*)malloc(sizeof(enemy)); 
    for(b=0;b<5;b++){ 
     arr[b]->x=b; 
     arr[b]->y=b*16; 
     printf("%d %d, ", arr[0]->x, arr[0]->y); 
    } 
} 

Примечания: окончательный Е() всегда выводит первую запись в массиве

Результата является:

0 0, 0 0, 0 0, 0 0, 0 0, 

что я изменил?

1) corrected the return type from main() 
2) prototyped the `function()` function. 
+0

Я просто скопировал этот код, и он не работает – Alex

+0

Я просто скопировал код из ответа, скомпилировал его, запустил все это на ubuntu linux 14.04. скомпилированный с помощью: 'gcc -c -ggdb -Wall -Wextra -pedantic -std-c99 code.c -o code.o', затем' gcc -ggdb code.o -o code', затем запускал его с помощью../code' и он дал правильный вывод: '0 0, 0 0, 0 0, 0 0, 0 0,' Что вы делали иначе? – user3629249

+0

Мой плохой, он работает. Огромное спасибо. – Alex

0

Каждый вызове функции? Вы имеете в виду, что вы называете это более одного раза?

Если это так, функция заменяет все указатели внутри arr на каждый вызов. Переместите петлю malloc на главную, затем вызовите функцию, как вы хотели бы

+0

Прошу прощения, я хотел сказать каждый раз, когда я вызываю printf – Alex

+0

@Alex Я скачал ваш код, построил его [с -Wall и с/без -O2] и запустил его. Я _unable_, чтобы воспроизвести вашу проблему. У меня даже были отпечатки printf arr [0] и arr [b] x/y пар - все в порядке. Я изучил код, и, похоже, все в порядке. Вы делаете какие-либо экзотические варианты компиляции? –

+0

Хорошо, спасибо в любом случае. Может быть, это что-то связано с машиной, для которой я развиваюсь. – Alex

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