【发布时间】:2014-07-01 18:18:25
【问题描述】:
所以我正在完成“Sams 每天一小时自学 C 编程,第七版”第 10 课练习 7,它要求“编写一个接受两个字符串的函数。使用 malloc() 函数分配足够的内存在连接(链接)后保存两个字符串。返回一个指向这个新字符串的指针。"
我确信有比我在下面尝试的更优雅的方法来解决这个问题。我最感兴趣的是为什么我的解决方案不起作用。我只学了几个月的 C 语言,并没有重要的编程背景。请让我知道为什么这会在编译时崩溃。我在 Win 7 上使用带有 GNU GCC 编译器的代码块,如果这有所作为的话。谢谢你:)
#include <stdio.h>
#include <stdlib.h>
char * concatenated(char array1[], char array2[]);
int ctrtotal;
int main(void)
{
char *comboString;
char *array1 = "You\'re the man ";
char *array2 = "Now Dog!";
comboString = (char *)malloc(ctrtotal * sizeof(char));
concatenated(array1, array2);
if (comboString == NULL)
{
puts("Memory error");
exit(1);
}
puts(comboString);
free(comboString);
return 0;
}
char * concatenated(char array1[], char array2[])
{
char *array3;
int ctr;
int ctr2;
for (ctr = 0; array1[ctr] != '\0'; ctr++)
array3[ctr] = array1[ctr];
ctr2 = ctr;
for (ctr = 0; array2[ctr] != '\0'; ctr++)
{
array3[ctr2 + ctr] = array2[ctr];
}
array3[ctr2 + ctr + 1] = '\0';
ctrtotal = (ctr2 + ctr + 2);
return array3;
}
感谢您的帮助。在查看了大家对我的错误的反馈后,我将代码修改为以下内容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * concatenated(char array1[], char array2[]);
int main(void)
{
char *array1 = "Testing Testing One Two ";
char *array2 = "Three. Finally, not crashing the mem o ry.";
char *comboString = malloc( (strlen(array1)+strlen(array2) + 1)*sizeof(char));
comboString = concatenated(array1, array2);
if (comboString == NULL)
{
puts("Memory error");
exit(1);
}
puts(comboString);
free(comboString);
return 0;
}
char * concatenated(char array1[], char array2[])
{
char *array3;
array3 = malloc( (strlen(array1)+strlen(array2) + 1)*sizeof(char) );
strcat(array3, array1);
strcat(array3, array2);
return array3;
}
如果有人看到可以/应该删除的任何冗余/不必要的剩余代码,请告诉我。我认识到尽可能简洁的好处。
【问题讨论】:
-
char *array3;您在使用它时从未为其分配内存。我对你的comboString的分配也没有信心——你不是忘记为终止的 null 分配一个额外的插槽吗? -
你也可以使用
ctrtotal而不给它分配任何东西。 -
是我还是
ctrtotal从未正确初始化?你只有int ctrtotal;所以我很不确定(char *)malloc(ctrtotal * sizeof(char));会做什么...... -
@smagnan
ctrtotal在程序加载时被初始化为零,所以他的代码将malloc零字节。 -
@smagnan 见stackoverflow.com/questions/1597405
标签: c string malloc concatenation