SIGSEGV (ошибка сегментации) в C


Я получаю ошибку сегментации SIGSEGV во время выполнения для кода ниже, когда вызывается функция (log_msg_send). Я читал, что речь идет о нарушении памяти, но не мог найти причину. Я был бы признателен за любые предложения/помощь.

 #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);
    }
}

ПС. Для людей, у которых есть проблема SIGSEGV. Большинство общих причин для проблемы SIGSEV: - попытка выполнить программу, которая не компилируется правильно. Обратите внимание, что большинство компиляторов не будут выводить двоичный файл, заданный a Ошибка времени компиляции. - переполнение буфера. - использование неинициализированных указателей. - разыменование нулевых указателей. - попытка доступа к памяти, которой программа не владеет. - попытка изменить память, которой программа не владеет (нарушение хранения). - превышение допустимого размера стека (возможно, из-за убегающей рекурсии или бесконечного цикла)

1 2

1 ответ:

Вы не выделяете память для 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_IP - это char*, поэтому его размер-это любой размер char указателей, обычно 8 или 4 байта. Вы, вероятно, имели в виду длину, поэтому придется использовать strlen.