2011-06-12 42 views
0

我想將一個char複製到給定char *指向的地址。C++:在一個給定的char *處寫一個char *導致段錯誤

很是由主調用函數:當我到複印用strncpy

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++; 
... 
} 

的段錯誤內還配備

strncpy(data, byte, 1); 

爲什麼會出現段錯誤?數據不是常量,我實際寫入的地址與我分配數據數組的地址完全相同。我已經測試過多次。

在此先感謝。

+1

此代碼甚至不應該編譯:'char數據= 「 」;' – Nawaz 2011-06-12 09:33:40

+0

char數據=「」; - 你的意思是char [] data =「」; ? – kinakuta 2011-06-12 09:35:05

回答

7

字符串文字是隻讀的。如果你想要一個modifyable字符串,必須使用數組,例如:

char data[10]; 

或者:

char *data = new char[10]; 

更詳細地說明一點:一個字符串字面量的類型實際上是const char*。因此,將字符串文字分配給非const char*在技術上是無效的,但由於傳統原因,大多數編譯器都允許它。許多現代編譯器至少會在您嘗試這樣做時發出警告。

+0

上面的版本無所事事。謝謝! +1 – sinned 2011-06-12 09:47:03

3

data被分配一個字符串文字。字符串文字只准備好,寫入它們會導致段錯誤。

試試這個:

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

代替。

0

爲什麼會出現段錯誤?數據不是常量,我實際寫入的地址與我分配數據數組的地址完全相同。

您沒有分配任何東西。 char *data = " ";甚至不應該用C++編譯。你正在給一個非常量分配一個常量字符串。

+0

我的錯誤。我其實寫了 char * data =「」; 但感謝您的解釋! – sinned 2011-06-12 09:43:57

+0

我無法理解爲什麼人們重新輸入代碼 - 複製和粘貼已經存在了30年 - 爲什麼有些人不使用它? – 2011-06-12 10:31:41

0
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 
}