c - 复制字符串缓冲区时出现段错误

标签 c string fault

我在复制字符串时遇到段错误。我尝试过类似的替代方案,但仍然存在同样的问题。

#if 0
       struct msghdr {
               void *msg_name; /* Socket name */
               int msg_namelen; /* Length of name */
               struct iovec *msg_iov; /* Data blocks */
              __kernel_size_t msg_iovlen; /* Number of blocks */
              void *msg_control; /* Per protocol magic (eg BSD file descriptor passing) */
              __kernel_size_t msg_controllen; /* Length of cmsg list */
              unsigned int msg_flags;
};
#endif


void call(char sendString[] )
{
    struct msghdr msg;
    int rc;
    struct sockaddr_in server_addr;
    memset(&server_addr, 0 , sizeof(struct sockaddr_in));
    memset(&msg, 0 , sizeof(struct msghdr));
    msg.msg_name = (void *)&server_addr;
    msg.msg_namelen = sizeof(struct sockaddr_in);
    printf("sendString = %s\n", sendString);
    //msg.msg_iov->iov_base = (void *)sendString; // seg fault here
    memcpy(msg.msg_iov->iov_base, sendString, strlen(sendString)); // seg fault here
    printf("len = %d\n", strlen(sendString));
    #if 0
    msg.msg_iov->iov_len = strlen(sendString);
    msg.msg_iovlen = 1;
    msg.msg_control = NULL;
    msg.msg_controllen = 0;
    msg.msg_flags = 0;
    #endif
    printf("rc = %d\n", rc);

}

int
main(int argc, char **argv){
    char buff[32] = "Hello\0";
    call(buff);
    return 0;
}

我已经尝试了这两种情况,并且在两行中都出现了段错误:

msg.msg_iov->iov_base = (void *)sendString;
memcpy(msg.msg_iov->iov_base, sendString, strlen(sendString));

感谢您的帮助。

最佳答案

msg.msg_iov 是一个指针,没有为此指针分配内存,并且您试图取消引用它,这将导致未定义的行为。

在执行memcpy()之前执行

msg.msg_iov = malloc(sizeof(struct iovec));

您尚未显示 struct iovec 定义,因此我假设其中的成员 iov_base 有足够的空间来容纳字符串(sendString) .

关于c - 复制字符串缓冲区时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37069687/

相关文章:

python - Python 中的同义词/连接字符串

ruby - 查找所有重复的非重叠子串和循环

string - 提取字符串表达式表示的所有可能的字符串集(汤普森构造的一部分)

c - 为了防止段错误,atexit() 函数应该放在哪里?

python - _PyString_Resize 是否重新分配内存?

c - 使用带有函数原型(prototype)的预处理器定义

c - 在Linux PAM模块中检索用户命令

c - 实现 malloc 时出现段错误

wcf - WCF IncludeExceptionDetailInFaults以编程方式?

c - 将 switch/case 替换为 #ifdef 或类似的内容