Назначение содержимого указателя C из другого указателя - PullRequest
0 голосов
/ 17 января 2019

Пока я пытался решить проблему с Деннисом Ритчи. Я получил следующую ошибку. Но я понятия не имею, почему это происходит. Похоже, это должно работать. Я использую MacOS Mojave и стандартный компилятор gcc. Мой исходный код следующий.

#include <stdio.h>
#include <string.h>
// copies most n characters of t to s; 
char *sstrcnpy(char *s, char *t, int n)
{
    // *pointer - content of the pointer will be assigned 
    char *ret; // ret stores the content of the dst 
    while(n--){
        *ret++ = *t++; 
    }
    printf("%s\n", ret);  
    return ret; 
}
int main()
{
    char *s = "Destination"; 
    char *t = "sour"; 
    char *sstrcnpy(char *s, char *t, int n); 
    sstrcnpy(s,t,3);
    printf("%s\n", s);
    return 0; 
}

Тогда, когда я пытаюсь запустить этот код. Терминал дал мне следующую ошибку.

nasantogtokhs-MacBook-Pro:C nasaa$ ./5_5
Segmentation fault: 11

Или вместо ошибки сегментации, в некоторых других исходных кодах это было

bus error: 10 

Тогда я попытался откопать, используя lldb Mac. Тогда я получил следующую ошибку.

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x0000000100000ef7 5_5`sstrcnpy(s="Destination", t="our", n=2) at exercise_5_5.c:10
   7        // *pointer - content of the pointer will be assigned 
   8        char *ret; // ret stores the content of the dst 
   9        while(n--){
-> 10           *ret++ = *t++; 
   11       }
   12       printf("%s\n", ret);  
   13       return ret;

Я думаю, что это связано с доступом к памяти. Кажется, как-то мой компьютер не позволяет присваивать значение указателю на содержимое отдельной функции. Но я видел другие примеры. Кажется, это должно работать просто отлично.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 21 января 2019

Я понял это. Ясно, что когда я инициализировал указатель char, его нельзя изменить, но мы можем изменить его содержимое, если выделим для него память. Я думаю, что причина этой ошибки в том, что, когда я инициализирую ее с явным присвоением массива char, программа пытается получить доступ к неприемлемому блоку памяти и пытается изменить его, что является правильным, поскольку инициализация - это просто отображение адреса константы в памяти указатель. И когда с динамическим распределением памяти в начале нет выделенной константы в памяти, выделенной для указателя, и функция strcpy прекрасно копировала символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...