繁体   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