我有一个名为string
的结构typedef struct {
char *s;
int len;
} string_t;
typedef struct {
uint32_t numb;
} msg_t;
在函数中的位置
void myfunct()
{
msg_t msg;
memset(&msg, 0, sizeof(msg));
msg.numb = 1;
char *ClientSendBuf[sizeof(msg)];
string_t buffer = {ClientSendBuf[sizeof(msg)],strlen(ClientSendBuf[sizeof(msg)])};
}
尝试使用UDP初始化一个数组(基本上是我需要稍后发送的缓冲区), 但它给了我一个分段错误的错误(在void myfunct的第三行。 所以缓冲区的问题是它应该是一种string_t,我该如何解决这个分段错误呢?
P.S。我忘了提到,我想使用memcopy将整个结构复制到缓冲区变量(应该是string_t类型)。我上面做错了吗?我怎么能这样做?
答案 0 :(得分:1)
在初始化结构时需要考虑一些事项,因为它有一个指针成员char *s
简单的赋值不起作用。简单赋值只会复制指针地址而不是它指向的内容
您的作业代码中存在一些问题:
1.您声明了一个char *
数组,其中包含sizeof(msg)
个元素,其中没有一个被分配内存;但您的结构需要char *
而不是char *[]
2.您正在访问一个超出范围(ClientSendBuf[sizeof(msg)]
)的数组元素,也没有指向任何有效地址。
您可以创建一个简单的char
数组&将其复制到结构中。当您使用指针成员时,您有责任分配内存和空闲内存
希望下面的代码可以为您提供一些参考:
void myfunct()
{
msg_t msg;
memset(&msg, 0, sizeof(msg));
msg.numb = 1;
char ClientSendBuf[] = "This is my message";
string_t buffer = {
strdup(ClientSendBuf), /*Can return NULL so add error check*/
strlen(ClientSendBuf)
};
/** Or **/
string_t buffer;
buffer.s = malloc(strlen(ClientSendBuf)+1);
if(NULL == buffer.s)
{
/* Memory allocation failed. Handle error.*/
}
/* Zero fill */
memset(buffer.s, 0, strlen(ClientSendBuf)+1);
strcpy(buffer.s, ClientSendBuf);
buffer.len = strlen(ClientSendBuf);
/*Opeartions with buffer*/
/*Call free in both cases !*/
free(buffer.s);
}
希望这有帮助!
答案 1 :(得分:0)
ClientSendBuf - 将一些内容放入其中并将其放在堆上。
答案 2 :(得分:0)
我看到两件事是错的。首先,访问ClientSendBuf[sizeof(msg)]
是未定义的行为,因为该字符在CliendSendBuf
结束之后。然后,当您预计char
时,您将分配ClientSendBuf[sizeof(msg)]
(即char *
)。
如果你想在该函数之外使用缓冲区,你必须将ClientSendBuf
放在堆上,因为它会在你退出后被其他堆栈帧覆盖(即排序被删除),因此指向的数据将被抛弃。
现在,由于您需要整个ClientSendBuff
的副本,因此需要一个string_t
数组。然后,将ClienSendBuff
中的每个指针分配给buffer
:
char *ClientSendBuff[sizeof(msg)];
string_t buffer[sizeof(msg)];
int i;
for(i = 0; i < sizeof(msg); i++) {
ClientSendBuff[i] = malloc(100); // you have to initialize (and free when
buffer[i].s = ClientSendBuff[i]; // you don't need them anymore) every pointer
buffer[i].len = 100;
}
但我不确定我是否明白你的观点。 char * []
如何适应char*
?
答案 3 :(得分:0)
问题是您没有为 ClientSendBuf 的任何元素分配内存。你应该在这里使用 malloc 来首先分配内存。