在C中创建一个字符串数组失败,为什么?

时间:2011-12-29 23:23:12

标签: c arrays string

我试图在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个字符串

5 个答案:

答案 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.