簡體   English   中英

帶字符串數組的分段錯誤

[英]Segmentation Fault with string array

我遇到了一些字符串數組問題,這些字符串似乎正在侵犯內存的保留空間。 代碼太大,無法在此處發布,因此我將在下面發布重要部分:

int main (  ){

 int i = 0, j = 0, k = 0, count = 0, numLinhas = 0, l = 0;
 char string[100][100];
 char line [17];
 char str[4];
 char str1[5];
 char str2[4];
 char str3[4];

 FILE *p;
 p = fopen("text.txt", "r");
 while(fgets(line, sizeof line, p)!=NULL){
  printf("%s", line);
  strncpy(string[i], line, 17);
  i++;
  numLinhas++; 
  }  
  fclose(p);
  char *temp[numLinhas]; 

此后,它進入一個循環,在該循環中,文件中包含的語句的含義存儲在string [i]中。 for和三個示例的開頭如下所示:

    for (i = 0; i<numLinhas; i++){
    sscanf( string[i], "%s %s %s %s" ,str1, str,str2, str3);
    if(str[0]=='0' && str[1] == '0' && str[2]!= 'd') {
    temp[i] = "NOP";
    count++;
    }
    if(str[0]=='0'&& str[1] == '6' && str[2]!= 'd') {
    sprintf(temp[i],"%s,%s" , "MVI B", str2);
    count = count+2;
    }

    if(str[0]=='0'&& str[1] == '7' && str[2]!= 'd') {
    temp[i] = "RLC";
    count++;
    }

該錯誤是偶然的-並非總是會發生。 它通常在調用sprintf時發生。 是啊! 下面是我正在加載的txt文件作為示例:

0000 21a 11r 00r
0003 7Ea
0004 21a 12r 00r
0007 46a
0008 80a
0009 21a 13r 00r
000C 77a
000D 3Ea 01a
000F 3Da
0010 76a
0011 0Ad
0012 03d
0013 01d

剛看到一些新東西。 這是我得到的編譯窗口:

marcos@john:~/Desktop$ ./paraler
0000 21a 11r 00rValor de l: 16

Valor de l: 1
0003 7Ea
Valor de l: 9
0004 21a 12r 00rValor de l: 16

Valor de l: 1
0007 46a
Valor de l: 9
0008 80a
Valor de l: 9
0009 21a 13r 00rValor de l: 16

Valor de l: 1
000C 77a
Valor de l: 9
000D 3Ea 01a
Valor de l: 13
000F 3Da
Valor de l: 9
0010 76a
Valor de l: 9
0011 0Ad
Valor de l: 9
0012 03d
Valor de l: 9
0013 01d
Valor de l: 9
string:0000 21a 11r 00r
string:

string:0003 7Ea

string:0004 21a 12r 00r
string:

string:0007 46a

string:0008 80a

string:0009 21a 13r 00r
string:

string:000C 77a

string:000D 3Ea 01a

string:000F 3Da

string:0010 76a

string:0011 0Ad

string:0012 03d

string:0013 01d

Segmentation fault

奇怪的是,我得到了字符串數組的一些空白...與錯誤有關嗎?

您是否在調用sprintf之前為每個temp[i]分配了內存? 如果沒有,那是你的問題。

if (!strncmp(str, "06", 2) && str[2] != 'd')
{
  temp[i] = malloc(5 + strlen(str2) + 2);  // Thanks, philippe
  if (temp[i])
    sprintf(temp[i], "%s,%s", "MVI B", str2);
}

盡管現在您必須跟蹤使用malloc分配了哪些temp元素,以便以后可以釋放它們。

編輯

在程序結束時,您可以循環遍歷temp數組,並對照上述字符串的開頭部分檢查每個元素的內容,如果它們匹配,請使用free釋放該元素:

for (i = 0; i < numLinhas; i++)
{
  if (strcnmp(temp[i], "MVI B", strlen("MVI B")) == 0)
    free(temp[i]);
}

您無需為分配了“ NOP”或“ RLC”的數組元素執行此操作; 在這種情況下,您只需將字符串文字的地址復制到數組元素。 沒有為這些元素分配新的內存,因此您不必擔心取消分配它們。

我立即看到了一些問題:

編輯第一點可能不適用於您的環境,但請記住這一點

  • 您試圖從一個整數創建char *temp[numLinHas] ,該整數的值將在運行時確定。 這在C99中是允許的,也可以通過編譯器擴展提供,但是在較早的C標准中,必須在編譯時知道數組大小。 您的代碼可能確實是這樣做的:

     int numLinHas = 0; char *temp[numLinHas]; 
  • 另一個問題是,當您執行sprintf ,您試圖復制到temp而沒有為存儲字符串的指針分配內存。

if(str[0]=='0'&& str[1] == '6' && str[2]!= 'd') {
    /* allocate memory to store instruction - to be freed later */  
    temp[i] = malloc(5 + strlen(str2) + 2); /* +2 for the comma */
    sprintf(temp[i],"%s,%s" , "MVI B", str2);
    count = count+2;
    }

當遇到以06開頭但不以d結尾的助記符時,就會出現問題。 sprintf()在temp [i] 未初始化的情況下寫入未分配的區域。 您應該分配一些空間來存儲sprintf的結果。

暫無
暫無

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

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