簡體   English   中英

在結構中分配給char *時出現段錯誤

[英]Segfault when assigning to char* in struct

所以我有一個結構“序列”,里面有一個char *。 當我嘗試創建序列時,每當我嘗試更改char *時,它都會出現段錯誤。 這是相關的代碼。 結構:

typedef struct _sequence {
  unsigned int length;
  unsigned char* bytes;
} Sequence;

構造函數:

Sequence* newSequence(unsigned char firstByte) {      //Creates new  sequence, allocates memory
  printf("Creating new Sequence\n");
  Sequence* seq = (Sequence*)malloc(sizeof(Sequence));
  printf("Have new sequence\n");
  seq->length = 1;
  printf("Set length\n");
  seq->bytes[0] = firstByte;
  printf("Set variables\n");
  return seq;
}

現在我這里有一個主要功能只是出於測試目的,該文件最終將沒有主要功能。 但是這是我以前測試的內容:

int main() {
  char test[] = "ab";
  printf("Testing sequences!\n");
  Sequence* newSeq = newSequence(test[0]);
  printf("Made new sequence!\n");
  outputSequence(newSeq, stdout);
  printf(" <-- new Sequence created\n");
  return 0;
}

printfs再次用於測試目的。 它始終在構造函數中一直打印到“設置長度\\ n”,然后出現段錯誤。 我究竟做錯了什么? 謝謝!

您為該結構正確分配了空間,但沒有為bytes元素指向的緩沖區分配任何空間。

這行調用未定義的行為,因為未初始化bytes

seq->bytes[0] = firstByte;

需要分配一個緩沖區並將seq->bytes指向該緩沖區。

Sequence* seq = malloc (sizeof(Sequence));

在這里,您為一個char *和一個int分配了內存空間,但是您需要通過char *指向的對象為要存儲的內容分配空間,方法是:

seq->bytes = malloc (my_string_size);

只有這樣,您才能開始在分配的內存塊中存儲字符。

編輯:例如,要存儲一個字符,您可以執行以下操作:

seq->bytes = malloc(1);
seq->bytes[0] = firstByte;

將其用作單個字符。 但是C中操作字符串的一個好習慣是總是以這種方式多保留一個字符:

seq->bytes = malloc(2);
seq->bytes[0] = firstByte;
seq->bytes[1] = '\0';

第二種方法看起來更像是C中的真實“字符串”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM