c ++: написать символ в данном символе * вызывает segfault - PullRequest
0 голосов
/ 12 июня 2011

Я хочу скопировать символ на адрес, на который указывает данный символ *.

это функция, которая вызывается main:

char data = "       ";
myfunction(data, somethingelse);
...

внутри функции у меня есть что-то вроде

void myfunction(char* data, short somethingelse) {
...
char byte = 0;
inputfilestream.read(&byte, 1);
*data = byte; // here i get the segfault
data++;
...
}

segfault также возникает, когда я копируюиспользование strncpy:

strncpy(data, byte, 1);

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

заранее спасибо.

Ответы [ 4 ]

7 голосов
/ 12 июня 2011

Строковые литералы доступны только для чтения. Если вы хотите изменить строку, вы должны использовать массив, например ::10000

char data[10];

Или:

char *data = new char[10];

Для уточнения: тип строкового литерала на самом деле const char*. Поэтому присвоение строкового литерала неконстантному char* технически недопустимо, но большинство компиляторов в любом случае допускают это по устаревшим причинам. Многие современные компиляторы по крайней мере выдают предупреждение, когда вы пытаетесь это сделать.

3 голосов
/ 12 июня 2011

data присваивается строковый литерал. Строковые литералы готовы только, и запись в них вызовет ошибки.

Попробуйте это:

char data[10]; // or whatever size you want.

вместо.

0 голосов
/ 12 июня 2011
char byte = 0;
inputfilestream.read(&byte, 1);
*data = byte; // here i get the segfault
data++; // << How many times?

Нет проблем

#include <stdio.h>

int main(int argc, char **argv)
{
    char *data = "Yello"; // or char data[] = "Yello";
    *data = 'H';
    puts(data); // Hello
}
0 голосов
/ 12 июня 2011

почему существует сегментация?данные не являются константными, и адрес, на который я в действительности пишу, точно такой же, как адрес, на котором я выделил массив данных.

Вы ничего не выделяли.char *data = " "; не должен даже компилироваться в C ++.Вы присваиваете константную строку неконстантной.

...