【发布时间】:2017-10-31 02:01:02
【问题描述】:
我正在尝试用 C 构造并返回一个字符串,但遇到了function returns address of local variable [-Wreturn-local-addr] 编译器警告。我知道返回packet 就像我尝试做的那样不起作用,因为数据包是指向我的大小为packet_size 的字符开头的指针,并且该内存地址在我的函数之外无效。我在 AVR 芯片上运行,不想使用malloc。我该如何解决这个问题?
#include <stdio.h>
#include <string.h>
#include <stdint.h>
const char* construct_packet(const char* data);
void append(char* str, char c);
int main()
{
const char* my_packet = construct_packet("QERT");
printf("%s", my_packet);
return 0;
}
const char* construct_packet(const char* data)
{
const char training_chars[] = "___";
const char start_char = '>';
uint8_t checksum = 0;
for(uint16_t i = 0; i < strlen(data); i++) {
checksum += data[i];
}
const char checksum_char = checksum;
uint8_t packet_size = strlen(training_chars) + strlen(data) + 2; // Plus 2 for start byte and checksum byte
char packet[packet_size];
strcat(packet, training_chars);
append(packet, start_char);
strcat(packet, data);
append(packet, checksum_char);
return packet;
}
void append(char* str, char c)
{
str[strlen(str) + 1] = c;
}
【问题讨论】:
-
这很肮脏,我讨厌这样做的想法,但是如果您无能为力,
static char*变量可以为您工作吗? -
@jonathon-reinhart OP 不能使用 malloc 你的副本是错误的。或者这个answer 可能不适用于这个问题。你说得对。
-
@Stargateur 阅读完整的第一个答案。