C中的SIGSEGV(分段错误)

时间:2012-05-26 20:47:46

标签: c posix sigsegv

当调用函数(log_msg_send)时,我在下面的代码的运行时获得了SIGSEGV - Segmentation Fault。我读到它是关于内存违规但我找不到原因。我很感激任何建议/帮助。

 #define  MAXSTRINGLENGTH 128
#define BUFSIZE 512

void log_msg_send(char *message, char *next_hop);

struct routing {
        int hop_distance;
        char sender_ID[16]; 
};

struct routing user_list[40]  =  { [0]={0,0,0,0}};


int main(int argc,char *argv[]){
    strcpy(user_list[0].sender_ID,"192.168.001.102");
    char message[1000];
    strcpy(message,"123456123456");
     log_msg_send(message, user_list[0].sender_ID);

    return 0;
}

void log_msg_send(char *message, char *next_hop){
    char *SRV_IP;
    strcpy(SRV_IP,  next_hop);

    if (sizeof(SRV_IP) == 16){
         struct sockaddr_in si_other;
         int s, i, slen=sizeof(si_other);
         char buf[60] ;
         strcpy(buf, message);

        if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1){
          fprintf(stderr, "socket() failed \n");
          exit(1);
        }

        memset((char *) &si_other, 0, sizeof(si_other));
        si_other.sin_family = AF_INET;
        si_other.sin_port = htons(33333);
        if (inet_aton(SRV_IP, &si_other.sin_addr) == 0) {
          fprintf(stderr, "inet_aton() failed \n");
          exit(1);
        }

          if (sendto(s, buf, BUFSIZE, 0,(struct sockaddr *) &si_other, slen)==-1){
          fprintf(stderr, "sendto() failed \n");
          exit(1);
        }

        close(s);
    }
}

PS。对于有SIGSEGV问题的人。 SIGSEV问题的大多数common reasons:   - 尝试执行无法正确编译的程序。请注意,鉴于编译时错误,大多数编译器都不会输出二进制文件。   - 缓冲区溢出。   - 使用未初始化的指针。   - 解除引用NULL指针。   - 尝试访问程序不拥有的内存。   - 尝试更改程序不拥有的内存(存储违规)。   - 超过允许的堆栈大小(可能是由于失控的递归或无限循环)

1 个答案:

答案 0 :(得分:4)

您没有为SRV_IP

分配内存
char *SRV_IP;
strcpy(SRV_IP,  next_hop);

因此strcpy尝试访问无效内存。

char *SRV_IP = malloc(strlen(next_hop)+1);
if (!SRV_IP) exit(1);
strcpy(SRV_IP,  next_hop);

然后你检查

if (sizeof(SRV_IP) == 16){

但是SRV_IPchar*,所以它的大小是char指针的大小,通常为8或4个字节。你可能意味着长度,所以必须使用strlen