2016-09-14 9 views
-1

Это компилируется в x86, но когда я использовал его в конфигурации x64, переменные x и y не имеют адреса при попытке получить к ним доступ? Нужно ли какое-то дополнение для выравнивания по более крупному адресу? Использование MSVC ..Как это получить для компиляции для x64

#define ARR_SIZE 25 

typedef struct { 
    unsigned int x; 
    unsigned int y; 
}Stuff; 

void allocateArray(Stuff *stuffArr) { 

    Stuff *stuff = malloc(sizeof (Stuff) * ARR_SIZE); 

    for (int i = 0; i < ARR_SIZE; i++) { 
     (*(stuff + i)) = (Stuff) { i, i + i }; 
    } 

    for (int i = 0; i < ARR_SIZE; i++) { 
     printf("%d : %d\n", (stuff + i)->x, (stuff + i)->y); 
    } 

    stuffArr = stuff; 
} 

void deallocateArray(Stuff *stuffArr) { 
    free(stuffArr); 
} 

int main(){ 
    Stuff * stuff = NULL; 

    allocateArray(stuff); 
    deallocateArray(stuff); 

    return 0; 
} 
+3

Это не должно работать ни для архитектуры. Строка 'stuffArr = stuff;' изменяет локальную копию 'stuffArr'. Он не влияет на переменную 'stuff' в' main'. – user3386109

+1

Кроме того, '(* (stuff + i))' такой же, как 'stuff [i]', а '(stuff + i) -> x' - это просто' stuff [i] .x' – user3386109

+0

_the x и y переменные не имеют адреса при попытке доступа к ним: что это значит? –

ответ

2

Я скопировать и вставить код в Visual Studio 2015 и скомпилированы в x86 и x64 и получил точно такой же вывод как раз, однако, как user3386109 сказал, вы фактически не изменяют переменную stuff в main.

Вы также можете использовать индексирование массива вместо добавления целых чисел в указатели, подобные этому.

for (int i = 0; i < ARR_SIZE; i++) { 
    stuff[i] = (Stuff) { i, i + i }; 
} 

for (int i = 0; i < ARR_SIZE; i++) { 
    printf("%d : %d\n", stuff[i].x, stuff[i].y); 
} 
+0

Я просто не знаю, что это за сделка, я изменил ее, чтобы получить (http://imgur.com/a/WeLJW) и [pastebin] (http://pastebin.com/By8szrqp) – spatmac

+0

Вам не хватает '#include '. Я скопировал ваш код из pastebin в визуальную студию, установил точно такие же настройки проекта и имел те же результаты, что и вы, но потом я заметил, что вам не хватает 'stdlib.h', добавлено это, а затем оно отлично справилось с x64. Почему он работал в x86 без 'stdlib.h', я не знаю. – PhantomWhiskers

+0

Это прослушивало меня полтора дня. Спасибо тонне !!! – spatmac

2

При передаче вещи в allocateArray создать локальную переменную, и когда вы remplace его в конце функции, переменная в основной не обновляется

Это должно работать, вы просто потеряли указатель в функции allocateArray

#define ARR_SIZE 25 

typedef struct { 
    unsigned int x; 
    unsigned int y; 
}Stuff; 

Stuff *allocateArray() { 

    Stuff *stuff = malloc(sizeof (Stuff) * ARR_SIZE); 

    for (int i = 0; i < ARR_SIZE; i++) { 
     (*(stuff + i)) = (Stuff) { i, i + i }; 
    } 

    for (int i = 0; i < ARR_SIZE; i++) { 
     printf("%d : %d\n", (stuff + i)->x, (stuff + i)->y); 
    } 

    return stuff; 
} 

void deallocateArray(Stuff *stuffArr) { 
    free(stuffArr); 
} 

int main(){ 
    Stuff * stuff = NULL; 

    stuff = allocateArray(); 
    deallocateArray(stuff); 

    return 0; 
} 
4

Как пользователь 3386109 говорит, код не верный. Вероятно, вы ожидаете, что функция allocateArray() возвращает выделенный указатель, в то время как вы передаете указатель по значению, так что переменная stuff внутри main() не будет обновлена.

Вы можете либо:

  • Изменение allocateArray() подпись void allocateArray(Stuff **stuffArr)
  • Измените allocateArray() подпись Stuff *allocateArray()

(имхо второй будет более идиоматических и понятно).

Я бы написать:

Stuff *allocateArray(size_t count) { 
    Stuff *stuff = (Stuff *) malloc(sizeof (Stuff) * count); 

    if (! stuff) 
     return NULL; 

    for (int i = 0; i < count; i++) { 
     stuff[i].x = i; 
     stuff[i].y = 2 * i; 

     printf("%d : %d\n", stuff[i].x, stuff[i].y); 
    } 

    return stuff; 
} 

void deallocateArray(Stuff *stuffArr) { 
    if (stuffArr) 
     free(stuffArr); 
} 

int main(){ 
    Stuff * stuff = allocateArray(ARR_SIZE); 
    deallocateArray(stuff); 

    return 0; 
} 
+0

Я просто не знаю, что это за сделка, я изменил ее, чтобы избавиться от глупых указателей, и это не будет компилировать как x64 [скриншоты] (http://imgur.com/a/WeLJW) и [pastebin] (http://pastebin.com/By8szrqp) – spatmac

0

Хороший вопрос, как он работает в x86. (это неопределенное поведение). Попробуйте следующее:

#define ARR_SIZE 25 
#include "stdlib.h" 
#include "stdio.h" 
typedef struct { 
    unsigned int x; 
    unsigned int y; 
}Stuff; 

void * allocateArray(Stuff *stuffArr) { //this row 

    Stuff *stuff = (Stuff*)malloc(sizeof (Stuff) * ARR_SIZE); 

    for (int i = 0; i < ARR_SIZE; i++) { 
     (*(stuff + i)) = (Stuff) { i, i + i }; 
    } 

    for (int i = 0; i < ARR_SIZE; i++) { 
     printf("%d : %d\n", (stuff + i)->x, (stuff + i)->y); 
    } 

    stuffArr = stuff; 
    return stuff; //this row 
} 

void deallocateArray(Stuff *stuffArr) { 
    free(stuffArr); 
} 

int main(){ 
    Stuff * stuff = NULL; 
    printf("%d\n",stuff); 
    stuff=(Stuff*)allocateArray(stuff); ///this row 
    printf("%p\n",stuff); 
    deallocateArray(stuff); 
    printf("%p\n",stuff); 
    return 0; 
} 
+0

Я просто не знаю, что это за сделка, я изменил ее, чтобы избавиться от тупых указателей, и она не будет компилироваться как x64 [скриншоты] (http://imgur.com/a/WeLJW) и [pastebin] (http: //pastebin.com/By8szrqp) – spatmac