是否可以在 c 中循环转换?

mil*_*bos 0 c pointers casting

有这个:

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

int main(){
    void *mem = malloc(10);
    for(int i =0; i<10 ; i++)
        (char*)mem[i] = 'a'; //want to cast in loop
}
Run Code Online (Sandbox Code Playgroud)

给出错误

warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]
   (char*)mem[i] = 'a';
warning: dereferencing ‘void *’ pointer
error: invalid use of void expression
   (char*)mem[i] = 'a';
Run Code Online (Sandbox Code Playgroud)

但是,必须循环之前完成转换是可以的:

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

int main(){
    char *mem = malloc(10);
    for(int i =0; i<10 ; i++)
        mem[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)

循环的步骤不进行任何转换。那么为什么我不能做前者,我在每个循环中投射指针?

Bli*_*ndy 5

(char*)mem[i]强制转换索引操作的结果,这已经是一个语义错误,因为您无法索引到void *. 此代码解决了您的问题:

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

int main(){
    void *mem = malloc(10);
    for(int i =0; i<10 ; i++)
        ((char*)mem)[i] = 'a'; //want to cast in loop
}
Run Code Online (Sandbox Code Playgroud)