通过引用伏都教的C字符串
我是一个新手程序员,非常感谢大家对我的问题提出的建议 我已经做了一个过程,在缓冲区中获取一个字符串,并将其解析为三个字符,用前2个“;”分隔 我试图做的是将3个字符指针传递到存储解析字符串的位置。但我在调用函数中得到的只是内存垃圾。我做错了什么通过引用伏都教的C字符串,c,string,C,String,我是一个新手程序员,非常感谢大家对我的问题提出的建议 我已经做了一个过程,在缓冲区中获取一个字符串,并将其解析为三个字符,用前2个“;”分隔 我试图做的是将3个字符指针传递到存储解析字符串的位置。但我在调用函数中得到的只是内存垃圾。我做错了什么 void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje){ char *temp; temp=(char *)malloc(s
void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje){
char *temp;
temp=(char *)malloc(sizeof(buf));
strcpy(temp, buf);
printf("\ntemp adentro de la funcion = %s\n", temp);
idNodo = strtok (temp,";");
idMensaje = strtok (NULL, ";");
mensaje = strtok (NULL, "\0");
printf("\nADENTRO\nidNodo: %s\nidMensaje: %s\nmensaje: %s", idNodo, idMensaje, mensaje);
}
此函数的调用方式如下:
char *idnod=NULL;
char *idmen=NULL;
char *men=NULL;
idnod=(char *)malloc(sizeof(buffer));
idmen=(char *)malloc(sizeof(buffer));
men=(char *)malloc(sizeof(buffer));
parseomensaje (buffer, &idmen, &idnod, &men);
char *strtok(char *str, const char *delim);
执行parseomensaje后,缓冲区包含其原始字符串,但idmen、idnod和men为空
我从教程中读到指针名称本身就是指针,所以这与通过引用传递参数是一样的,但是对于字符串,我需要将指针地址传递给指针指向指针的指针。。。
,但我还在努力想办法
我为我的英语道歉,请随意指出我写作中的任何错误。:) 这是不正确的:
char *temp;
temp=(char *)malloc(sizeof(buf));
由于数组将在函数中降级为char*
,因此只分配sizeof(char*)
字节(通常为4
或8
字节)。如果buf
的实际长度大于4
或8
字节,则程序具有未定义的行为,因为strcpy()
将写入超出数组边界的内容。基本上:
void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje){
相当于:
void parseomensaje(char* buf, char **idNodo, char **idMensaje, char **mensaje){
如您所说,如果您是一名新手程序员,我建议您避免动态内存分配,直到您对该语言更熟悉为止。修改程序以使用固定大小的数组而不是动态分配的内存(并防止写入超出数组边界)。一旦你能工作并完全理解它,然后尝试使用动态分配的内存。首先,你的程序中有多个内存泄漏。一旦你不再需要这些代码,就考虑释放你分配的每一个内存块。 关于你的职能:
void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje)
为什么要在函数上传递char**
指针?改为传递char*
。因为strtok是这样声明的:
char *idnod=NULL;
char *idmen=NULL;
char *men=NULL;
idnod=(char *)malloc(sizeof(buffer));
idmen=(char *)malloc(sizeof(buffer));
men=(char *)malloc(sizeof(buffer));
parseomensaje (buffer, &idmen, &idnod, &men);
char *strtok(char *str, const char *delim);
此外,在调用
parseomensaje
之前,您不需要分配任何内存,因为strtok会在您自己的内存上返回指针,不是新分配的。不是问题的解决方案,但从不强制转换由malloc返回的指针
缓冲区的大小是多少?char**
传递给函数,以便调用方可以看到更改,除非strcpy()
用于填充参数(应该是这样).@hmjd在这种情况下,在调用用户函数之前也不应该执行内存分配。这是正确的。我相信OP错误地认为=
会复制字符串。@hmjd这确实是初学者的一个常见错误。感谢您的回复,我确实无法与malloc进行更正,但如果我对该句子进行注释,我会得到一个SegFault错误。但我确信我对此负有全部责任:)@user3306636,如果您只是取消对malloc
的注释,那么temp
就是一个统一化的指针。需要内存才能复制到:char temp[256]代码>例如。