4

我做了这个功能:

void procesar_llamadaAFuncion(t_proceso *unProceso, char *sentencia){
    char *nombreFuncion = sentencia;
    char *nombreFuncionSinParentesis = NULL;

    string_trim(&nombreFuncion);
    nombreFuncionSinParentesis = malloc(sizeof(char)*(strlen(nombreFuncion)-2));
    strncpy(nombreFuncionSinParentesis, nombreFuncion, strlen(nombreFuncion)-2);

    puts(nombreFuncionSinParentesis);

    push_stack(unProceso->pcb->seg_stack, nombreFuncionSinParentesis, unProceso->pcb->program_counter);

    unProceso->pcb->program_counter = get_pos_funcion(unProceso->pcb->funciones, nombreFuncionSinParentesis);

    free(nombreFuncion);
    free(nombreFuncionSinParentesis);

t_proceso 是什么并不重要,问题是这个函数接收一个字符数组。

该函数将始终接收其“某物()”的字符数组,我要做的是删除最后两个字符“()”,然后调用函数push_stack()。

问题是当我运行 Valgrind 时,我得到了这个:

==17129== Invalid read of size 1
==17129==    at 0x4C2BFD4: __GI_strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17129==    by 0x50BFCEB: puts (ioputs.c:37)
==17129==    by 0x403D30: procesar_llamadaAFuncion (proceso.c:455)
==17129==    by 0x40313D: procesar_siguiente_instruccion (proceso.c:132)
==17129==    by 0x404B1A: probarProcesos (test.c:83)
==17129==    by 0x404C7F: main (test.c:111)
==17129==  Address 0x5436da8 is 0 bytes after a block of size 8 alloc'd
==17129==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17129==    by 0x403CDF: procesar_llamadaAFuncion (proceso.c:452)
==17129==    by 0x40313D: procesar_siguiente_instruccion (proceso.c:132)
==17129==    by 0x404B1A: probarProcesos (test.c:83)
==17129==    by 0x404C7F: main (test.c:111)

我不知道我做错了什么,所以任何帮助将不胜感激。

4

3 回答 3

3

这是因为strncpy不会以空值终止目标字符串:

将源的前 num 个字符复制到目标。如果在复制 num 个字符之前找到源 C 字符串的结尾(由空字符表示),则用零填充目标,直到总共写入了 num 个字符。

如果 source 比 num 长(因此,在这种情况下,destination 可能不是以 null 结尾的 C 字符串),则不会在目标末尾隐式附加空字符。

这应该可以解决问题:

size_t nobmreLen = strlen(nombreFuncion)-2;
// Don't forget to add +1 for the null terminator
nombreFuncionSinParentesis = malloc(sizeof(char)*(nobmreLen+1));
strncpy(nombreFuncionSinParentesis, nombreFuncion, nobmreLen);
nombreFuncionSinParentesis[nobmreLen] = '\0';
于 2012-10-30T03:06:40.290 回答
0
 nombreFuncionSinParentesis = malloc(sizeof(char)*(strlen(nombreFuncion)-2));

以上不正确,您还需要为空终止分配空间。我不明白 -2 做了什么,但是在您尝试的任何内容中添加 +1 字节,即

malloc(sizeof(char)*(strlen(nombreFuncion)-2 + 1));

正如评论中所建议的那样,不应使用 strncpy,它是为古代 unix 版本的特定需求而编写的一个不起眼的函数。阅读这篇文章,或者确实是作为对另一个答案的评论而发布的好文章。

free(nombreFuncion);

上面很可疑,你正在做free(sentencia)的是分配在函数之外的。如果这是意图,您应该考虑更好的程序设计。

于 2012-10-30T07:45:26.697 回答
0

你必须空终止你的字符串。这对参数“sentencia”和删除括号的结果都很重要

于 2012-10-30T03:07:04.720 回答