ошибка сегментации в моем коде с помощью strcpy - PullRequest
0 голосов
/ 31 мая 2018

Я получаю ошибку сегментации после strcpy (buffer_two, argv [1]);Не уверен, что здесь происходит, и я был бы признателен за понимание того, что не так и почему я получаю эту ошибку сегментации.

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int value = 5;
    char buffer_one[8], buffer_two[8];

    strcpy(buffer_one, "one"); // Put "one" into buffer_one
    strcpy(buffer_two, "two"); // Put "two" into buffer_two
    printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
    printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);

    printf("\n[STRCPY] copying %d bytes into buffer_two\n\n", strlen(argv[1])); //Copy first argument into buffer_two

    strcpy(buffer_two, argv[1]); // <---- here

    printf("[After] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
    printf("[After] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
    printf("[AFTER] value is at %p and is %d (0x%08x)\n", &value, value, value);     
}

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Существует две возможные причины ошибки seg.

1) Нет argv[1], т.е. вы пытаетесь скопировать из нулевого указателя (то есть ... Если программа запущена безаргументы, argv[1] может быть получен доступ, но будет возвращать указатель NULL. Следовательно, копирование с него является недопустимым и может вызвать ошибку сегмента).Таким образом, если вы запустите программу наподобие ./program, то программа завершится сбоем, поскольку argv[1] равно NULL

2) Длина argv[1] превышает пункт назначения, то есть 7 символов и завершающий NUL.Если это так, вы пишете вне границ и можете вызвать ошибку сегмента.

Чтобы получить правильный код, выполните:

int main(int argv,char * argv[])
{
    char buffer_two[8];
    if ((argc >  1) && (strlen(argv[1]) < 8)) // Make sure arg[1] is there
                                              // Make sure it's not too long
    {
            strcpy(buffer_two, argv[1]);
    }
    else
    {
        printf("Illegal start of program\n");
    }
    return 0;
}

BTW

При печати указателя с использованием %p убедитесь, что приведено значение void*

Так что

printf("[After] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);

должно быть

printf("[After] buffer_two is at %p and contains \'%s\'\n", (void*)buffer_two, buffer_two);
0 голосов
/ 31 мая 2018

Здесь есть две основные проблемы: вы не проверяете argc, чтобы увидеть, существует ли argv[1], и вы слепо копируете argv[1] в буфер, который может быть недостаточно большим, чтобы уместиться в него.Я также исправил некоторые предупреждения компилятора, относящиеся к вашим операторам printf.Вот пример использования вашего кода с помощью вашего кода:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
   if(argc < 2) {
      printf("Please enter an argument when invoking this program\n");
      return EXIT_FAILURE;
   }
    int value = 5;
    char buffer_one[8], buffer_two[8];

    strcpy(buffer_one, "one"); // Put "one" into buffer_one
    strcpy(buffer_two, "two"); // Put "two" into buffer_two
    printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", (void *)buffer_two, buffer_two);
    printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", (void *)buffer_one, buffer_one);

    printf("\n[STRCPY] copying %zu bytes into buffer_two\n\n", strlen(argv[1])); //Copy first argument into buffer_two

    strncpy(buffer_two, argv[1], 8); // <---- here
    if(buffer_two[7] != '\0'){
       printf("[ERROR] string did not fit into buffer, truncating\n");
       buffer_two[7] = '\0';
    }

    printf("[After] buffer_two is at %p and contains \'%s\'\n", (void *)buffer_two, buffer_two);
    printf("[After] buffer_one is at %p and contains \'%s\'\n", (void *)buffer_one, buffer_one);
    printf("[AFTER] value is at %p and is %d (0x%08x)\n", (void *)&value, value, value);     
}
0 голосов
/ 31 мая 2018

Проверьте значение argc перед использованием argv.Используйте strcpy только тогда, когда argc> 1.Сделайте условный оператор перед тем, как strcpy ()

Например, *

int main(int argv,char * argv[])
{
    char buffer[10];
    if (argc >  1 && strlen(argv[1]) < 10)
    {
        strcpy(&buffer[0],argv[1]);
    }
    return 0;
}

Вы должны запустить программу с помощью

./a.out hai

hai - переданный аргумент.Здесь argc равно 2, argv [1] = hai

...