gpt4 book ai didi

c - LLVM 字符串输入/输出

转载 作者:太空宇宙 更新时间:2023-11-04 08:30:59 28 4
gpt4 key购买 nike

我想在 LLVM 代码函数中编写读取两个字符串,将它们连接起来并打印出来。打印和读取函数在用 C 编写的外部库中。

我试过这个:

declare void @printString(i8*)
declare i8* @readString()
declare i8* @concat(i8*, i8*)

define i32 @main() {
L1:
%v2 = call i8* @readString()
%v4 = call i8* @readString()
%v5 = call i8* @concat(i8* %v2, i8* %v4)
call void @printString(i8* %v5)
%v6 = add i32 0, 0
ret i32 %v6
}

但它抛出:段错误(核心已转储)我想我需要做一些位播,有什么建议吗?

编辑:这就是我实现 C 函数的方式:

void printString(char* s)
{
printf("%s\n", s);
return;
}

char* readString()
{
char* tmp;
scanf("%s", tmp);
return tmp;
}

char* concat(char* s1, char* s2)
{
char* t = malloc(strlen(s1)+strlen(s2)+1);
return strcat(strcpy(t,s1),s2);
}

最佳答案

您的 readString 函数已损坏(它从不初始化 tmp,因此它指向一个随机内存位置,scanf 然后尝试写入该位置,调用未定义的行为)并且可能会在任何使用它的程序中导致段错误,无论它是用 LLVM 还是 C 编写的。

您的 LLVM 代码没有任何问题 - 不需要位转换。如果正确定义了 readString 函数,代码将完美运行。

关于c - LLVM 字符串输入/输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28382037/

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