我正在尝试为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;
}
答案 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
调用。