使用指针

时间:2015-09-18 23:22:58

标签: c pointers buffer tftp

我使用带有 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语句之前。只有这样我才能在调用函数上打印文件名字符串。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

因为您没有为char* filename分配任何内存。

如果你知道字符串从缓冲区+ 2开始并且有\0终止符,那么你可以直接执行:

char* parseFileName(char* buffer) {
  return strdup(buffer);
}

char* fileName = parseFilename(buffer+2);

请注意,当您完成文件名时,这需要free