我需要char数组的帮助。我想创建一个n-lenght数组并初始化它的值,但是在malloc()函数之后,数组比n * sizeof(char)长,并且数组的内容不仅仅是我分配的字符...在数组中很少随机的字符,我不知道如何解决这个问题...我需要在学校考试的一个项目的代码部分,我必须在周日结束...请帮助:P
#include<stdlib.h>
#include<stdio.h>
int main(){
char *text;
int n = 10;
int i;
if((text = (char*) malloc((n)*sizeof(char))) == NULL){
fprintf(stderr, "allocation error");
}
for(i = 0; i < n; i++){
//text[i] = 'A';
strcat(text,"A");
}
int test = strlen(text);
printf("\n%d\n", test);
puts(text);
free(text);
return 0;
}
答案 0 :(得分:3)
在使用strcat
make
text[0]=0;
strcat
期望第一个参数的空终止char
数组。
#include <string.h>
char *strcat(char * restrict s1,
const char * restrict s2);
strcat函数附加s2指向的字符串的副本 (包括终止空字符)到字符串的结尾 s1指出。 s2的初始字符会覆盖null s1末尾的字符。
如果不这样做,您认为strcat
将如何知道第一个字符串的结束位置
将\0
放入s1
。
另外,不要忘记为\0
字符分配额外的字节。否则你正在写你已分配的内容。这又是未定义的行为。
早些时候你有未定义的行为。
注意:
您应该检查malloc
的返回值,以了解malloc
调用是否成功。
不需要转换malloc
的返回值。在这种情况下,隐式地完成从void*
到相关指针的转换。
strlen
返回size_t
而不是int
。 printf("%zu",strlen(text))
答案 1 :(得分:0)
首先,您可以在
中使用malloc
text = (char*) malloc((n)*sizeof(char)
不理想。您可以将其更改为
text = malloc(n * sizeof *text); // Don't cast and using *text is straighforward and easy.
所以陈述可能是
if(NULL == (text = (char*) malloc((n)*sizeof(char))){
fprintf(stderr, "allocation error");
}
但实际问题在于
for(i = 0; i < n; i++){
//text[i] = 'A';
strcat(text,"A");
}
strcat
文档说
dest - 这是指向目标数组的指针,该数组应该包含 一个C字符串,应该足够大以包含连接 结果字符串。
只是要指出上面的方法存在缺陷,你只需要考虑C字符串"A"
实际上包含两个字符, A 和终止 \ 0 (空字符)。在这种情况下,当i
为n-2
时,您具有超出范围的访问权限或缓冲区溢出 1
。如果您想用 A 填充整个text
数组,那么您可以完成
for(i = 0; i < n; i++){
// Note for n length, you can store n-1 chars plus terminating null
text[i]=(n-2)==i?'A':'\0'; // n-2 because, the count starts from zero
}
//Then print the null terminated string
printf("Filled string : %s\n",text); // You're all good :-)
注意:使用 valgrind 之类的工具查找内存泄漏情况&amp;超出内存访问。