C在函数中分配指针,不更改原始指针(void *)

时间:2019-11-27 23:33:38

标签: c arrays pointers char

我正在尝试为char s [128]数组分配新值。但是执行功能后,s的地址不变。另一方面,该功能对于int来说也很好。


void myscanf(const char *type, void *var){
    char buffer[128];
    memset(buffer,0,sizeof(buffer));
    int size = read(0, buffer, 128);
    if(strcmp(type, "%d") == 0){
        int *d = (int*)var;
        *d = buffer[0] - '0';   
    }
    else if(strcmp(type,"%s") == 0){
        char* str = (char*) var;
        str = buffer;
    }
}

int main(){
    int d;
    char s[128];
    myscanf("%s", s);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

char* str = var;(不需要广播)将var无效指针转换为本地存储的char *指针,然后用&buffer[0](第一个元素的地址)覆盖该值buffer char数组的值,隐式衰减)。

这没有明显的效果(可以完全优化)。

您可能希望通过var / str指针从缓冲区中复制字符,然后\0终止:

char* str = var;
memcpy(str, buffer, size);
str[size]='\0';

请注意,read应该请求了127个字节(或者myscanf调用者应该提供了128+1个字节的空间),并且您应该检查read调用是否可能失败。

不需要memset调用。