有没有办法将不兼容的指针类型转换为 c 中的不同指针类型?



从我之前的问题双指针与指针到数组,不兼容的指针类型,我使用固定指针(指针到数组(而不是可修改的指针(双指针(,所以我在想是否有办法进行转换,因此从一个更改为另一个兼容的指针类型。(我不会发布源代码,因为它可能看起来是重复的,但我关心的是 asm 解决方案,所以请先查看链接(。

当我看到一个带有-S标志的编译程序集时,字符串org在堆栈上传递(从地址-64(%rbp)开始(,然后将该地址传递给函数strsepleaq -64(%rbp), %rax。所以一切看起来都不错。以下是 ASM 代码段:

main:
pushq   %rbp    #
movq    %rsp, %rbp  #,
subq    $64, %rsp   #,
# a.c:6:     char *token, org[] = "Cats,Dogs,Mice,,,Dwarves,Elves:High,Elves:Wood";
movabsq $7453250866027716931, %rax  #, tmp93
movabsq $3183030514286931059, %rdx  #,
movq    %rax, -64(%rbp) # tmp93, org
movq    %rdx, -56(%rbp) #, org
movabsq $8315182520643044396, %rax  #, tmp94
movabsq $5204599198995727660, %rdx  #,
movq    %rax, -48(%rbp) # tmp94, org
movq    %rdx, -40(%rbp) #, org
movabsq $7311150089436161897, %rax  #, tmp95
movq    %rax, -32(%rbp) # tmp95, org
movl    $1867987571, -24(%rbp)  #, org
movw    $25711, -20(%rbp)   #, org
movb    $0, -18(%rbp)   #, org
# a.c:7:     while((token=strsep((char**)&org,",")))
jmp .L2 #
.L3:
# a.c:8:         printf("Token: %sn",token);
movq    -8(%rbp), %rax  # token, tmp89
movq    %rax, %rsi  # tmp89,
leaq    .LC0(%rip), %rdi    #,
movl    $0, %eax    #,
call    printf@PLT  #
.L2:
# a.c:7:     while((token=strsep((char**)&org,",")))
leaq    -64(%rbp), %rax #, tmp90
leaq    .LC1(%rip), %rsi    #,
movq    %rax, %rdi  # tmp90,
call    strsep@PLT  #
movq    %rax, -8(%rbp)  # tmp91, token
# a.c:7:     while((token=strsep((char**)&org,",")))
...

但最终,它变得微不足道。我知道strsep想要一个类型(char**(,一个指针地址,但我给它应该包含相同内容的-64(%rbp)地址。那么为什么是签名呢?2. 如何正确地将不兼容的指针类型转换为兼容的等效指针类型?

编辑:这不是同一个问题。在链接中,我询问了 c 中的内涵。现在我询问 asm 中的解决方案。它可能看起来具有误导性,但我喜欢伪装我不明白。对于那些如何认为我在问同样的问题的人,我不是。请先看一下链接,我想要这里的组装解决方案

获取char [N]数组的地址会导致数组指针char (*)[N]。 这与char **非常不同。 前者不会创建新的指针变量,而这正是您需要的。

请尝试以下操作:

int main(){
char *token, org[] = "Cats,Dogs,Mice,,,Dwarves,Elves:High,Elves:Wood";
char *ptr = org;
while((token=strsep(&ptr,",")))
printf("Token: %sn",token);
}

这应该做你想要的。 请注意,ptr是通过调用strsep来修改的。

最新更新