2012-02-17 79 views
1

我知道这个问题听起来很愚蠢,但我已经尽我所能,似乎我不能有与此代码解决的问题:当返回一个int值时Segfault;

struct bacon_statement* statms;// = (struct bacon_statement*)malloc(3000 * sizeof(struct bacon_statement)); 

int ind = 0; 
char** yay = strsplit(code, ";"); 
char* a = *yay; 

while (a != NULL) { 

    puts(a); 

    if (strncmp(a, "#", 1)) { 
     struct bacon_statement statm; 
     int valid = bacon_make_statement(a, statm); 
     if (valid != 0) { return valid; } 

     statms[sta] = statm; 
    } 

    sta++; 
    *(yay)++; 
    a = *yay; 
} 

puts("Running BACON INTERNAL MAKE"); 
int ret = bacon_internal_make(statms, internal); 
printf("%d\n", ret); 
return ret; 

它出现segfaults当return ING,因为它的printf是执行正常,另一个printf调用/之后/函数被调用(在int main())根本不打印任何东西。

对不起,如果这听起来太具体,但我不知道还有什么地方可以得到帮助。

+0

为什么你的malloc注释掉?没有它,对'statms [']的分配就无法工作。而且,它在返回时发生段错误,这意味着你可能在栈上覆盖了某些东西,例如返回尝试返回垃圾。在退货之前发生错误。 – Irfy 2012-02-17 00:57:38

+0

此外,向我们展示'bacon_ *'函数的实现将是必不可少的,因为问题可能在那里。使它更加容易和:这使得它很烦人(中,也许,politer条款 - 此外,使用像'了'和'变量问什么时候寻求帮助,因为阅读国外代码往往够繁琐yay'几乎是一种侮辱很可能让其他人通过使用更有意义的变量/函数/等名称来帮助你)。 – Irfy 2012-02-17 01:02:54

+1

您也不会显示'sta'的声明或初始化。 – 2012-02-17 01:06:35

回答

3

显然你以某种方式破坏了堆栈。 你行不初始化指针:

struct bacon_statement* statms;// = (struct bacon_statement*)malloc(3000 * sizeof(struct bacon_statement)); 

,但你写它是这样,这将有不确定的操作:

statms[sta] = statm; 

最简单的方式来解决可能是恢复的malloc(提供的大小是正确的)

struct bacon_statement* statms = (struct bacon_statement*)malloc(3000 * sizeof(struct bacon_statement)); 
2

看起来像堆栈溢出,您不断检查边界,将数据分配给缓冲区(statms)。迟早,返回地址(位于堆栈上)将被覆盖,当返回时,返回的地址将被破坏。并有你的分段错误。

1

尝试做这样的事情:

int count = 0; 
char *ptr = strchr(code, ';'); 
while (ptr) { 
    count++; 
    ptr = strchr(ptr + 1, ';'); 
} 

预测语句的数量,然后:

struct bacon_statement* statms = (struct bacon_statement*) malloc(
    count * sizeof(struct bacon_statement)); 

分配足够bacon_statement槽。替代品可能更难:链接列表或其他可变结构;或者使用realloc来增加数组的大小,记下你留下了多少个sots。

虽然错误仍然可以在其他功能!

0

有没有可能是你想用的IND代替STA作为数组索引变量,STA未初始化?

+0

编号* ind *只是我必须删除的变量。 – Matoe 2012-02-17 01:23:10

1

代码确实太多了。让我来总结一下:

struct bacon_statement* statms;// = (struct bacon_statement*)malloc(3000 * sizeof(struct bacon_statement)); 

int ind = 0; 
char** yay = strsplit(code, ";"); 
char* a; 

while ((a = *yay)) { 

    puts(a); 

    if (strncmp(a, "#", 1)) { 
     struct bacon_statement statm; 
     int valid = bacon_make_statement(a, statm); 
     if (valid != 0) { return valid; } 

     statms[sta] = statm; 
    } 

    sta++; 
    *(yay)++; 
} 

puts("Running BACON INTERNAL MAKE"); 
int ret = bacon_internal_make(statms, internal); 
printf("%d\n", ret); 
return ret; 

但我们能比这更紧凑:

struct bacon_statement* statms;// = (struct bacon_statement*)malloc(3000 * sizeof(struct bacon_statement)); 

int ind = 0; 
char** yay;; 
char* a; 

for (yay = strsplit(code, ";"); (a = *yay); *(yay)++) { 

    puts(a); 

    if (strncmp(a, "#", 1)) { 
     struct bacon_statement statm; 
     int valid = bacon_make_statement(a, statm); 
     if (valid != 0) { return valid; } 

     statms[sta] = statm; 
    } 

    sta++; 
} 

puts("Running BACON INTERNAL MAKE"); 
int ret = bacon_internal_make(statms, internal); 
printf("%d\n", ret); 
return ret; 

现在让我们去掉傻stringcompare:

struct bacon_statement* statms;// = (struct bacon_statement*)malloc(3000 * sizeof(struct bacon_statement)); 

int ind = 0; 
char** yay; 
char* a; 

for (yay = strsplit(code, ";"); (a = *yay); *(yay)++) { 

    puts(a); 

    if (*a != '#') { 
     struct bacon_statement statm; 
     int valid = bacon_make_statement(a, statm); 
     if (valid != 0) { return valid; } 

     statms[sta] = statm; 
    } 

    sta++; 
} 

puts("Running BACON INTERNAL MAKE"); 
int ret = bacon_internal_make(statms, internal); 
printf("%d\n", ret); 
return ret; 

还是没有意义。 IMO希望通过一系列字符串指针(yay)循环并处理每个字符串。特别是*(yay)++看起来很尴尬。

也许用“#”他要跳过注释。我希望是这样的:

sta=0; 
for (yay = strsplit(code, ";"); (a = *yay); yay++) { 
    int err; 
    if (*a == '#') continue; 
    /* make bacon from a */ 
    err = bacon_make_statements(a, statms[sta]); 
    if (err) return err; 
    sta++; /* could overflow ... */ 
    } 

/* you need the number of assigned struct members ("sta") to this function */ 
return bacon_internal_make(statms,sta internal); 

关于第二个想法,我的猜测是,strsplit()函数返回一个指针自动(“堆栈”)变量。或者* yay变量增加超出识别范围。或者statms []数组被索引超出范围。