«Стек вокруг переменной ‘buffer’ был поврежден» — Что здесь не так

#c #arrays #string

#c #массивы #строка

Вопрос:

Я хочу проанализировать числа с IP-адреса, который вводится пользователем. Я написал следующий код, чтобы получить входной IP-адрес от пользователя и распечатать каждый байт адреса.

КОД: (Прямо сейчас я предполагаю, что пользовательский ввод похож на «xx.xx.xx.xx»)

 #include <stdio.h>
#include <string.h>
void main(){

    char ip[16];
    char buffer[6];
    int i=0;
    char temp;
    int len;
    char *ptr1;
    char *ptr2;
    char delim = '.';
    while((temp = getchar()) != 'n')
    {
        ip[i  ]=temp;
    }
    ip[i] = '';
    ptr2 = ip;
    for(i=0;i<4;i  ){
        ptr1 = strchr(ptr2,(int)delim);
        strcpy(buffer,ptr2);
        if(ptr1 != NULL){
            buffer[ptr1-ptr2] = '';
            ptr2=ptr1 1;
        }       
        printf("nString:%s",buffer);
    }


    getchar();

}
  

Код выполняется нормально, но в конце сеанса запуска или отладки он выдает ошибку

 Run-Time Check Failure #2 - Stack around the variable 'buffer' was corrupted.
  

В чем проблема с моим кодом?

Комментарии:

1. Вы ничего не проверяете, чтобы убедиться, что вы остаетесь в пределах своих буферов стека!

2. @JonathonReinhart Прямо сейчас я предполагаю, что входными данными являются A.A.A.A, где A<=255.

3. Запустите свой код в отладчике и проверьте каждый доступ к вашим буферам. Опять же, вы не можете отправлять сообщения в SO с повреждением стека и не ожидать, что на отсутствие проверки границ будет указано, сложно .

4. Самая непосредственная причина вашего переполнения strcpy(buffer, ptr2); . Вы не можете поместиться A.A.A.A в 6 байт.

5. Я работаю над Visual Studio 2010. Я проверял переменные на каждом шаге и менял ip[i] = 'NULL' на ip[i] = '' (да, это была ошибка). Мой ввод был 1.1.1.1 . Все та же ошибка.

Ответ №1:

 strcpy(buffer,ptr2);
  

Эта строка отвечает за ошибку. Ваш buffer размер равен 6, но ptr2 содержит более 6 символов (например, xx.xx.xx.xx = 12), поэтому он переполняет его. Увеличить buffer размер. Это решит вашу проблему.

Также добавьте проверку привязки к массиву, как предложил @jonathon. Эта строка ip[i ]=temp; может создать проблему для большего ввода.

Комментарии:

1. Также, ради любви $DEITY , добавьте проверку границ .

Ответ №2:

Так много проблем:

 #include <stdio.h>
#include <string.h>
void main(){

    char ip[16];
    char buffer[6];
    int i=0;
    char temp;
    int len;
    char *ptr1;
    char *ptr2;
    char delim = '.';
    while((temp = getchar()) != 'n')
    {
        ip[i  ]=temp;            // What is preventing you from writing to ip[16 ] ?
    }
    ip[i] = NULL;                // '' is the NUL terminator. NULL is a pointer.
    ptr2 = ip;
    for(i=0;i<4;i  ){
        ptr1 = strchr(ptr2,(int)delim);
        strcpy(buffer,ptr2);     // Again, you can easily overrun buffer here
        if(ptr1 != NULL){
            buffer[ptr1-ptr2] = '';
            ptr2=ptr1 1;
        }       
        printf("nString:%s",buffer);
    }


    getchar();

}