我使用带有 512字节缓冲区的 recvfrom 接收 TFTP数据包(读取请求)。
字符串(要传输的文件名)从缓冲区的第三个字节开始。前两个是为操作码保留的。
我写了以下函数:
char * parseFileName(char * buffer){
char * filename;
for(int i = 0; buffer[i] != '\0'; i++)
*(filename + i) = buffer[i];
*(filename + i) = '\0';
return filename;
}
我把它称为考虑操作码偏移:
char * filename = parseFileName(buffer + 2);
然而,这不起作用,程序停止:
printf("%s", filename);
除非我添加:
printf("\n");
在parseFileName函数的return语句之前。只有这样我才能在调用函数上打印文件名字符串。
为什么会这样?
答案 0 :(得分:2)
因为您没有为char* filename
分配任何内存。
如果你知道字符串从缓冲区+ 2开始并且有\0
终止符,那么你可以直接执行:
char* parseFileName(char* buffer) {
return strdup(buffer);
}
char* fileName = parseFilename(buffer+2);
请注意,当您完成文件名时,这需要free
。