在C中操作动态数组

时间:2013-04-10 18:05:08

标签: c memory-management dynamic-memory-allocation

我正在尝试从SPOJ(PL)解决StringMerge (PP0504B)问题。基本上问题是编写一个函数string_merge(char *a, char *b),它返回一个指向char数组的指针,该数组包含从char数组创建的字符串,并且交替选择后续字符(数组的长度是作为参数提供的较短数组的长度)。

我创建的程序适用于测试用例,但是当我将它发布到SPOJ的判断时失败了。我在这里发布我的代码,因为我相信问题与内存分配有关(我还在学习C的这一部分) - 你能看一下我的代码吗?

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

#define T_SIZE 1001

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

char* string_merge(char *a, char *b) {
    int alen = strlen(a); int blen = strlen(b);
    int len  = (alen <= blen) ? alen : blen;
    int i,j;

    char *new_array = malloc (sizeof (char) * (len));
    new_array[len] = '\0';
    for(j=0,i=0;i<len;i++) {
            new_array[j++] = a[i];
            new_array[j++] = b[i];
    }
    return new_array;
}

int main() {
    int n,c; scanf("%d", &n);
    char word_a[T_SIZE];
    char word_b[T_SIZE];
    while(n--) {
        scanf("%s %s", word_a, word_b);
        char *x = string_merge(word_a, word_b);
        printf("%s",x);
        printf("\n");
        memset(word_a, 0, T_SIZE);
        memset(word_b, 0, T_SIZE);
        memset(x,0,T_SIZE);
    }
  return 0;
}

注意:我正在使用-std=c99标志进行编译。

2 个答案:

答案 0 :(得分:4)

关接一个。

char *new_array = malloc (sizeof (char) * (len));
new_array[len] = '\0';

你写的是new_array的界限。您必须为len + 1字节分配空间:

char *new_array = malloc(len + 1);

此外,sizeof(char)始终为1,因此拼写出来是多余的,len周围的括号也是如此。

Woot,更多错误!

那么你继续在j循环的每次迭代中继续增加for两次。所以基本上你最终写的(大约)是为你分配空间的两倍。

此外,您在使用后free()返回值string_merge()时会泄漏内存。

此外,我看不到memset的用途,我建议您使用fgets()strtok_r()来获取两个单词而不是scanf()(这不符合你的想法。

答案 1 :(得分:0)

char *new_array = malloc (sizeof (char) * (len*2 + 1));
new_array[len*2] = '\0';