C在函数中分配指针,不';t更改原始指针(void*)
我正在尝试为我的char s[128]数组分配新值。但在执行该功能后,s的地址不变。另一方面,该函数对于ints来说工作得很好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
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。