gpt4 book ai didi

c - 这是 LLVM 中的错误吗?

转载 作者:行者123 更新时间:2023-11-30 18:17:47 24 4
gpt4 key购买 nike

我正在编译此代码(使用 clang 3.4.2):

#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>

typedef struct __entry {
char *name;
int value;
} entry;

int main(int argv, char **argc) {
printf("Size of entry: %lu\n", sizeof(entry));
entry *entry = malloc(sizeof(entry));
printf("entry is at %lu\n", (uint64_t) entry);
}

我收到这个位码:

define i32 @main(i32 %argv, i8** %argc) #0 {
entry:
%argv.addr = alloca i32, align 4
%argc.addr = alloca i8**, align 8
%entry1 = alloca %struct.__entry*, align 8
store i32 %argv, i32* %argv.addr, align 4
store i8** %argc, i8*** %argc.addr, align 8
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([20 x i8]* @.str, i32 0, i32 0), i64 16)
%call2 = call noalias i8* @malloc(i64 8) #3
%0 = bitcast i8* %call2 to %struct.__entry*
store %struct.__entry* %0, %struct.__entry** %entry1, align 8
%1 = load %struct.__entry** %entry1, align 8
%2 = ptrtoint %struct.__entry* %1 to i64
%call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([17 x i8]* @.str1, i32 0, i32 0), i64 %2)
ret i32 0
}

对 printf 的调用接收 16 作为参数(我期望在 64 位系统上有两个指针的结构体)。然而,对 malloc 的调用收到 8。在 C 中,它们都得到相同的参数。这是怎么回事?

最佳答案

两次调用 sizeof 没有得到相同的参数!只是乍一看他们确实如此。

第一个 sizeof(entry) 指的是类型名称。

第二个sizeof(entry)指的是局部指针变量。

变量定义后,就不能再在代码块中引用该类型了。

这意味着标题问题的答案是“否 - LLVM 遵循标准的要求”。

一个小怪癖:第一个 sizeof(entry) 必须有括号,因为参数是类型名称。第二个 sizeof(entry) 可以写成 sizeofentry 因为这个参数是变量的名称而不是类型。这使您可以确认第二次出现的是变量而不是类型。

关于c - 这是 LLVM 中的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44343457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com