указатели на строку в C - PullRequest
       1

указатели на строку в C

1 голос
/ 12 января 2011

У меня есть эта программа на C

#include<stdio.h>

int main()
{
    printf("Hello New!\n");
    char c = 'd';
    char* s = "hello world";
    char **t = &s;
    *t[0] = c;
    return 0;
}

Программа компилируется, но не запускается. У меня есть этот вывод:

Hello New!
Bus error

Я не понимаю, почему

Ответы [ 4 ]

3 голосов
/ 12 января 2011

Строковые константы хранятся в постоянной памяти, и вы не можете их изменять.

Если необходимо, используйте:

#include<stdio.h>

int main()
{
    printf("Hello New!\n");
    char c = 'd';
    char s[] = "hello world";
    char **t = &s[0];
    *t[0] = c;
    return 0;
}

Это выделяет локальную переменную (не константу), котораяудобно инициализируется и может быть изменен в соответствии с вашими пожеланиями.

2 голосов
/ 12 января 2011

Строковые константы неизменяемы, несмотря на то, что по историческим причинам они имеют тип char*, а не const char*. Попробуйте использовать строковую константу для инициализации массива, а не указатель:

#include <stdio.h>
int
main(void)
{
    char s[] = "hello new!";
    puts(s);
    s[0] = 'c';
    puts(s);
    return 0;
}
2 голосов
/ 12 января 2011

Вы не можете каким-либо образом изменять строку, на которую указывает 's'.Это часть памяти, которую вы не можете изменить.

1 голос
/ 12 января 2011

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

Я бы предположил, что в этом случае это потому, что вы пытаетесь записать в память только для чтения. Строка "hello world" находится в сегменте памяти, в который вам запрещено писать. В зависимости от операционной системы эти сегменты памяти либо защищены, либо вы можете записать в нее произвольный мусор. Похоже, ваш не позволяет этого. Как вы можете видеть в других ответах, вы можете обойти это, скопировав / инициализировав строковую константу в массив.

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