返回的字符数超过malloc分配的字符数

返回的字符数超过malloc分配的字符数,c,string,C,String,我正在用C写一个函数,它接受两个长度相同的字符串 例如: S1=“你好”和S2=“12345” 并返回一个混合输入字符串中字符的结果,结果字符串中的第一个字符是来自S1的第一个字符,第二个字符是来自S2的第一个字符,r中的第三个字符是来自S1的第二个字符,r中的第四个字符是来自S2的第二个字符,依此类推 因此,如果:- S1 = "Hello" S2 = "12345" Result = "H1e2l3l4o5" 我的函数如下所示: #include <stdio.h> #incl

我正在用C写一个函数,它接受两个长度相同的字符串

例如:

S1=“你好”和S2=“12345”

并返回一个混合输入字符串中字符的结果,结果字符串中的第一个字符是来自S1的第一个字符,第二个字符是来自S2的第一个字符,r中的第三个字符是来自S1的第二个字符,r中的第四个字符是来自S2的第二个字符,依此类推

因此,如果:-

S1 = "Hello"
S2 = "12345"
Result = "H1e2l3l4o5"
我的函数如下所示:

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

char* mix(char *s1, char *s2)
{
    int length = strlen(s1);
    char* result = malloc(sizeof(char) * length * 2);
    int i, j;
    for(i = 0, j = 0; i < (length); i++, j = j + 2)
    {
        result[j] = s1[i];
        result[j + 1] = s2[i];
    }
    return result;
}

这让我很困惑,因为我没有为这么多字符分配足够的“结果”内存,也没有收到分段错误或类似性质的警告。我显然做错了什么吗?

发生这种情况是因为结果中的字符串没有以null结尾。添加此行以解决此问题:

result[j] = '\0';
您需要解决的另一个问题是为空终止符分配空间:

char* result = malloc(length * 2 + 1);
C标准要求
sizeof(char)
1
,因此不需要乘以它


最后,您需要确保
s2
有足够的长度复制到结果中,即
strlen(s2)>=strlen(1)

发生这种情况是因为您没有在结果中以null结尾的字符串。添加此行以解决此问题:

result[j] = '\0';
您需要解决的另一个问题是为空终止符分配空间:

char* result = malloc(length * 2 + 1);
C标准要求
sizeof(char)
1
,因此不需要乘以它


最后,您需要确保
s2
有足够的长度复制到结果中,即
strlen(s2)>=strlen(1)
您没有为终止C字符串所需的内存分配内存,当然,您没有将它放在字符串后面。这就是为什么代码从内存打印垃圾,直到垃圾到达第一个空字符

char* mix(char *s1, char *s2)
{
    int length = strlen(s1);
    char* result = malloc(sizeof(char) * (length * 2 + 1));
    int i, j;
    for(i = 0, j = 0; i < length; i ++, j = j + 2)
    {
        result[j] = s1[i];
        result[j + 1] = s2[i];
    }
    // Put the null character to end the the string
    result[j] = 0;

    return result;
}
char*mix(char*s1,char*s2)
{
int长度=strlen(s1);
char*result=malloc(sizeof(char)*(长度*2+1));
int i,j;
对于(i=0,j=0;i
显然,代码还应该检查
s2
的长度,但碰巧不需要这样做


如果
s1
s2
长,则在循环期间复制
s2
的空终止字符,结果字符串的长度为
2*strlen(s2)
。如果
s2
s1
长,则代码只复制其第一个
长度
字符。

您没有为终止C字符串所需的字符分配内存,当然也没有将其放在字符串后面。这就是为什么代码从内存打印垃圾,直到垃圾到达第一个空字符

char* mix(char *s1, char *s2)
{
    int length = strlen(s1);
    char* result = malloc(sizeof(char) * (length * 2 + 1));
    int i, j;
    for(i = 0, j = 0; i < length; i ++, j = j + 2)
    {
        result[j] = s1[i];
        result[j + 1] = s2[i];
    }
    // Put the null character to end the the string
    result[j] = 0;

    return result;
}
char*mix(char*s1,char*s2)
{
int长度=strlen(s1);
char*result=malloc(sizeof(char)*(长度*2+1));
int i,j;
对于(i=0,j=0;i
显然,代码还应该检查
s2
的长度,但碰巧不需要这样做


如果
s1
s2
长,则在循环期间复制
s2
的空终止字符,结果字符串的长度为
2*strlen(s2)
。如果
s2
s1
长,则代码只复制其第一个
长度
字符。

不要忘记nul终止字符串。并将1添加到malloct缺少字符串分隔符
\0
。请看一下
strlen
不会给出以结尾终止的空字节,因此您的
malloc()
中需要ad+1字节。我投票结束这个问题,因为关于nul终止和malloc-ed内存大小的问题在这里被回答了数百次。OP甚至没有尝试使用searchdon忘记nul终止字符串。并将1添加到malloct缺少字符串分隔符
\0
。请看一下
strlen
不会给出以结尾终止的空字节,因此您的
malloc()
中需要ad+1字节。我投票结束这个问题,因为关于nul终止和malloc-ed内存大小的问题在这里被回答了数百次。OP甚至没有尝试使用搜索