C 字符连接和内存重新分配
我正在尝试将单个数字连接到字符串:C 字符连接和内存重新分配,c,concatenation,base,C,Concatenation,Base,我正在尝试将单个数字连接到字符串: include <stdio.h> include <stdlib.h> include <string.h> int main() { char *test=""; int i; for (i = 0; i < 10; i++) char *ic; ic = malloc(2); sprintf(ic, "%d", i); // printf("%d\n", st
include <stdio.h>
include <stdlib.h>
include <string.h>
int main() {
char *test="";
int i;
for (i = 0; i < 10; i++)
char *ic;
ic = malloc(2);
sprintf(ic, "%d", i);
// printf("%d\n", strlen(test));
if (strlen(test) == 0)
test = malloc(strlen(ic));
strcpy(test, ic);
} else {
realloc(test, strlen(test) + strlen(ic));
strcat(test, ic);
}
}
printf("%s\n", test);
// printf("%c\n", test);
free(test);
test = NULL;
return 0;
}
包括
包括
包括
int main(){
char*test=“”;
int i;
对于(i=0;i<10;i++)
字符*ic;
ic=malloc(2);
sprintf(ic,“%d”,i);
//printf(“%d\n”,strlen(test));
如果(strlen(test)==0)
测试=malloc(strlen(ic));
strcpy(测试,ic);
}否则{
realloc(测试,strlen(测试)+strlen(ic));
strcat(测试、集成电路);
}
}
printf(“%s\n”,测试);
//printf(“%c\n”,测试);
免费(测试);
test=NULL;
返回0;
}
我的目标是得到最终的
printf(“%s”,test)
be0123456789
请记住字符串以空字符结尾。为字符串分配内存时,必须为null添加额外的字节。因此,您需要为每个malloc()
和realloc()
调用添加1。例如:
test = malloc(strlen(ic) + 1);
还要记住,realloc()
允许将变量“移动”到内存中的新位置。它可能需要这样做才能找到足够的连续未分配空间。如果无法分配您请求的内存,它还可以返回NULL
,因此您应该这样调用它:
char *new_mem = realloc(test, strlen(test) + strlen(ic) + 1);
if (new_mem == NULL) {
// Not enough memory; exit with an error message.
} else {
test = new_mem;
}
几个问题:
char*test=”“代码>-将测试指向常量C字符串。你不给它写信,但它很危险,而且会用C++编译。”
的类型是const char*
strlen
返回字符串的长度,而不是缓冲区大小。您需要添加+1以包含空字符。这是你最大的问题ic
。一个简单的字符数组。您还忘了free()
itic=malloc(2)代码>-为什么?为什么不字符集[2]
?或者,为什么不简单地使用'0'+
来获取数字的字符表示法呢?可能是因为这是一个学习练习。没错,感谢您抽出时间,非常感谢您快速清晰的解释。谢谢你的时间,我希望有一天能了解我自己。很好,谢谢你的进一步解释。我仍然对constchar类型感到困惑(维基百科并没有很好地解释这一点)。我的问题是,是否有必要为所有声明的指针释放内存?分配内存的时间,之后必须清空吗?非常感谢…内存管理是C/C++的核心。我强烈建议你找一本书(很多都有)读一些基础知识。这会节省你很多时间const char
表示该类型为consant只读访问。使用“
的单个副本,可以在代码中的多个位置使用”
。如果它在运行时被更改,其他使用它的地方将失败。