【问题标题】:How do i get this to compile for x64 [duplicate]我如何让它编译为 x64 [重复]
【发布时间】:2017-01-21 22:52:42
【问题描述】:

这在 x86 中编译得很好,但是当我在 x64 配置中使用它时,当我尝试访问它们时 x 和 y 变量没有地址?是否需要某种填充来对齐更大的地址?使用 MSVC..

#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;
}

【问题讨论】:

  • 它不应该适用于任何一种架构。 stuffArr = stuff; 行更改了 stuffArr 的本地副本。它对main 中的变量stuff 没有影响。
  • 另外,(*(stuff + i))stuff[i] 相同,而(stuff + i)-&gt;x 只是stuff[i].x
  • 这是一个常见问题解答错误。让我看看能不能找到一个重复的。
  • 显然我们没有规范的副本...我们应该创建一个,因为这是一个常见的错误。
  • 那里,I made one

标签: c pointers struct malloc 64-bit


【解决方案1】:

正如 user3386109 所说,代码不正确。可能您期望allocateArray() 函数返回分配的指针,而您通过值传递指针,因此main() 中的变量stuff 不会被更新。

你可以:

  • 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;
}

【讨论】:

  • 我只是不知道交易是什么,我改变了它以摆脱愚蠢的指针,它不会编译为 x64 screenshotspastebin
【解决方案2】:

我将您的代码复制并粘贴到 Visual Studio 2015 中并在 x86 和 x64 中编译,两次都得到完全相同的输出,但是就像 user3386109 所说,您实际上并没有更改 main 中的变量 stuff

你也可以使用数组索引而不是像这样向指针添加整数。

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);
}

【讨论】:

  • 我只是不知道交易是什么,我改变了它以摆脱愚蠢的指针,它不会编译为 x64 screenshotspastebin
  • 你错过了#include &lt;stdlib.h&gt;。我将您的代码从 pastebin 复制到了 Visual Studio,设置了完全相同的项目设置,并获得了与您相同的结果,但后来我注意到您缺少 stdlib.h,添加了它,然后它在 x64 中工作得很好。为什么它在没有stdlib.h 的情况下在 x86 中工作,我不知道。
  • 这已经困扰了我一天半了。非常感谢!!!
  • 没问题!如果我不得不猜测它为什么在 x86 中工作,Windows/MSVC 可能为 mallocfree 等函数内置了默认的 32 位实现,但没有 64 位的默认值。一般来说,在进行动态内存分配时,请始终记住包含stdlib.h
【解决方案3】:

当你在 allocateArray 中传递东西时,你会创建一个局部变量,当你在函数末尾替换它时,main 中的变量不会更新

这应该可以,你只是在 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】:

    好问题是它在 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;
    }
    

    【讨论】:

    • 我只是不知道交易是什么,我改变了它以摆脱愚蠢的指针,它不会编译为 x64 screenshotspastebin
    猜你喜欢
    • 2010-09-14
    • 2011-06-23
    • 2013-01-03
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    相关资源
    最近更新 更多