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

C在函数中分配指针,不';t更改原始指针(void*),c,arrays,pointers,char,C,Arrays,Pointers,Char,我正在尝试为我的char s[128]数组分配新值。但在执行该功能后,s的地址不变。另一方面,该函数对于ints来说工作得很好 void myscanf(常量字符*类型,void*变量){ 字符缓冲区[128]; memset(buffer,0,sizeof(buffer)); int size=read(0,缓冲区,128); if(strcmp(类型,“%d”)==0){ int*d=(int*)变量; *d=缓冲区[0]-“0”; } else if(strcmp(类型,“%s”)==0

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


void myscanf(常量字符*类型,void*变量){
字符缓冲区[128];
memset(buffer,0,sizeof(buffer));
int size=read(0,缓冲区,128);
if(strcmp(类型,“%d”)==0){
int*d=(int*)变量;
*d=缓冲区[0]-“0”;
}
else if(strcmp(类型,“%s”)==0){
char*str=(char*)变量;
str=缓冲区;
}
}
int main(){
int d;
chars[128];
myscanf(“%s”,s);
返回0;
}

char*str=var
(不需要强制转换)将
var
void指针转换为本地存储的
char*
指针,然后用
&buffer[0]
的地址覆盖该值(bufferchar数组的第一个元素,默认值)

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

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

char* str = var;
memcpy(str, buffer, size);
str[size]='\0';
请注意,
read
应该请求127字节(或者
myscanf
调用者应该提供
128+1
字节的空间),并且您应该检查
read
调用是否可能失败


memset
调用是不必要的。

C使用传递值,函数接收参数的副本数组不是指针。您无法重新分配阵列可能的重复项。但是,您并不想将指向本地数组的指针返回到主函数。为什么它对int有效,但对该数组无效?@JakubBalicki int版本使用
*
(在
*d
中)通过指针进行存储<代码>字符*str=var;str=缓冲区仅在本地存储参数,然后用本地地址覆盖该本地变量。不寄信就随意使用邮政地址不会在家外产生任何影响。谢谢,它就像一个符咒一样有效:)也谢谢你提供的有用提示
memcmpy
->
memcpy
:)@Groo谢谢。我很累,下午我确实花了不少时间玩
memcmp
,结果显示:D。