为什么我的C代码在Windows中出错? Linux还可以

时间:2015-07-17 13:49:01

标签: c gcc

有我的C代码,它是leetcode problem,我得到了#34;运行时错误"。所以我在VS2013中重新编译,问题是free(++tmp),为什么?我无法得到它,我写了这样的C代码,只想了解更多有关指针的内容。

#include <stdio.h>
#include <stdlib.h>

/*   Add binary.
 *   a = "11", b = "1"
 *   result = "100"
 */

char *add_binary(char *a, char *b);

int main()
{
    printf("%s\n", add_binary("10", "1"));
    printf("%s\n", add_binary("1111", "1111"));
    return 0;
}

char *add_binary(char *a, char *b)
{
    int alen = 0, blen = 0, sum = 0;
    int len;
    char *tmp, *result;

    while(*a++) alen++;
    while(*b++) blen++;
    a -= 2;
    b -= 2;
    len = alen > blen ? alen : blen;
    tmp = (char *)malloc(len*sizeof(char));
    printf("%p\n", tmp);

    while(*a || *b){
        if(*a){
            sum += *a - '0' + 0;
            a--;
        }
        if(*b){
            sum += *b - '0' + 0;
            b--;
        }
        if(sum > 1){
            *tmp++ = 3 == sum ? '1' : '0';
            sum = 1;
        } else {
            *tmp++ = 1 == sum ? '1' : '0';
            sum = 0;
        }
    }
    *tmp = '\0';

    len += 1 == sum ? 1 : 0;
    result = (char *)malloc(len*sizeof(char));
    if(1 == sum){
        *result++ = '1';
    }
    while(*(--tmp)){
        *result++ = *tmp;
    }
    *result = '\0';
    printf("%p\n", tmp);
    free(++tmp);
    tmp = NULL;
    return (result-len);
}

4 个答案:

答案 0 :(得分:6)

您只能将结果指针值free传递给malloc

tmp = (char *)malloc(len*sizeof(char));

然后

free(tmp);

没问题。

free(++tmp)free(tmp + 42)不正常,并调用未定义的行为。

答案 1 :(得分:1)

在释放之前停止修改mallocated指针。如果你想使用指针算法,例如&#39; * tmp ++&#39;,那么保留一份原件的副本,以便释放空间。

我不知道为什么你会这样做(++ tmp);&#39;。但是,到那个时候,你已经完全通过在while循环中递增tmp来完成tmp了,这没有任何意义:(

编辑:顺便说一下,你已经搞砸了&#39;结果&#39;同样。您正在返回一个无法被调用者正确释放的malloced和bodged指针。

无论什么&#39;聪明&#39;你正在尝试使用指针操作,停止它。这很容易弄错!

答案 2 :(得分:0)

以下是另一个答案中稍微详细的回复。

指针是您为其分配内存的地址。当您将地址传递给之前已经过malloc的地址时,没有任何问题。问题是你没有传递malloc空间的地址。您正在传递可能位于malloc空间内的某些内容的地址,因此无法释放。

答案 3 :(得分:0)

free期望其参数为从先前mallocrealloc调用返回的相同指针值。如果在将指针值传递给free之前修改该指针值,则行为未定义且可能发生坏事(这就是为什么它似乎适用于一个平台并打破另一个平台;实际上,它是&#39; s两个都坏了)。

您需要保留从malloc来电中返回的指针值:

char *tmp, *tmpOrig;
...
tmp = tmpOrig = malloc(len * sizeof *tmpOrig); // note no cast, operand of sizeof
...
/**
 * modify tmp to your heart's desire
 */
...
free( tmpOrig );

你需要为result做同样的事情。

除非您使用的是C89之前的编译器,否则不应转换malloc的结果。这是不必要的,在C89 / C90编译器下可以掩盖错误。