我试图在C中创建一个字符串数组。这是代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main()
{
char *foo[100];
strcpy(foo[0], "Testing this");
printf("%s ", foo[0]);
return 1;
}
但是当我编译它时,它就会破坏。没有错误,没有任何错误,它根本不起作用和打破。有什么建议吗?当我tri char * foo [10]它可以工作,但我不能只使用10个字符串
答案 0 :(得分:4)
您分配了一个指针数组,但没有为它们分配任何内存指向它们。您需要调用malloc
来从堆中分配内存。
char *foo[100];
foo[0] = malloc(13);
strcpy(foo[0], "Testing this");
当你完成它之后,你需要free
以后的记忆。
您的代码会调用所谓的undefined behavior。基本上任何事情都可能发生,包括代码按预期工作。如果带有char *foo[10]
的版本按预期工作,那就简单到了运气。
顺便说一下,你的main()
定义是错误的。它应该是int main(void)
。
答案 1 :(得分:1)
您正在分配未分配的指针。 char * foo [100]是一个包含100个未分配指针的数组,它们指向内存中未知的位置,您可能无法访问它们。
答案 2 :(得分:1)
你正在创建一个指向没有位置的100个指针。正如David所解释的,您需要动态分配内存。但是,如果您知道字符串(或最大值)的大小,也可以让编译器为您执行此操作:
// Create an array of 10 strings of size 100 and initialize them automatically
char foo[10][100] = {0};
// Now you can use it them and not worry about memory leaks
strcpy(foo[0], "text");
// Or use the safer version
strcpy_s(foo[0], 100, "text");
答案 3 :(得分:0)
扩展其他人的答案:
char *foo;
是指向角色的指针。可以为其分配单个字符的地址,或者为“\ 0”终止的字符序列中的第一个字符分配地址。它也可以通过malloc()分配一个地址。
char foo[100];
是100个字符的空格或空格,最多99个字符的字符串和终止的'\ 0'字符。
char *foo[100];
是100个字符指针,即100 char *foo;
个类型。
答案 4 :(得分:0)
#include <stdlib.h>
#include <stdio.h>
int main(void){
char *foo[100];
foo[0] = malloc(13*(sizeof(char)));
strcpy(foo[0], "Testing this");
printf("%s ", foo[0]);
return 0;
}
这是您的代码的更正版本。
MISTAKE: not allocating enough memory for the string.
CORRECTION: using malloc to allocate 13 blocks of memory for the string.