初始化数组时出现分段错误

时间:2011-09-30 13:38:56

标签: c

我有一个名为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类型)。我上面做错了吗?我怎么能这样做?

4 个答案:

答案 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 来首先分配内存。