1

我一直试图了解什么是 malloc() 以及为什么要使用它。我知道 malloc 用于动态分配内存,如果您不知道要创建多少内存,则需要它。我一直在做一些动手操作。

下面的代码声明了一个字符指针数组,第一个字符指针用“hello”初始化。这工作正常。

int main()
{


char *strarray[5];
strarray[0]="hello";
printf("%s\n",strarray[0]);
return 0;
}

但是,如果我尝试使用 strcpy() 函数将“hello”字符串复制到 strarray[0](没有 malloc()),就会出现问题。它进入一些循环并且不复制字符串。如果我使用 malloc 分配内存,它工作正常。

int main()
{

char *strarray[5];
//strarray[0]=(char *)malloc(sizeof(char)*10);
strcpy(strarray[0],"hello");
printf("%s\n",strarray[0]);
return 0;
}

我想知道有什么不同?如果我可以将“hello”初始化为不使用 malloc 的 char 指针,为什么我不能对 strcpy() 做同样的事情。

4

3 回答 3

2
char *strarray[5];

将分配五个指向字符的指针数组(可以解释为字符串)。

不会分配用于放置这五个字符串的内存空间。所以,如果你想让所有的指针指向不同的字符串,你需要自己分配它们。

但是,由于这些是指针,因此如果您不想分配任何东西,您实际上并不需要分配任何东西。这就是您的第一个示例有效的原因。strarray[0]="hello";将使数组的第一个元素指向"hello"存储字符串文字的位置(编译器会为您将此文字放在内存中的某个位置,因此您的指针将指向有效的内存位置)。

总而言之,在第一个示例中,您的指针指向已分配和初始化的内存"hello"(编译器为您完成了此操作) - 您不是在复制字符串,您只是为指针赋值。在第二个示例中,您的指针指向某个未定义的位置,您没有明确保留该位置,但您正试图将其写入。

于 2013-09-13T20:17:23.977 回答
2

这是错误的:char *strarray[5];这是堆栈分配 5 个 char* 指针。我想你想写char strarray[6],它会在堆栈上创建 6 个字符。这可以容纳“你好”及其隐含的 NULL 终止符(NULL 终止符告诉 C 函数一个字符串已经结束)。

写完char strarray[6];strcpy(strarray, "hello");是安全的。然后你可以调用:

printf("%s\n",strarray);

我删除了 [0]:%s期望 a char*not a char:strarray[0]是一种char类型。

你用来malloc堆上分配内存。我是否可以建议您阅读 Kernighan 和 Ritchie(C 编程语言)以了解更多详细信息?

于 2013-09-13T20:17:37.413 回答
0

malloc():分配一块大小字节的内存,返回一个指向块开头的指针。

void* malloc (size_t size);  

size_t是一种unsigned int类型。

如果您不知道要创建多少内存,则需要它,这是不正确的。
您应该知道需要多少最小内存。

在 malloc() 的帮助下,您可以在run time不分配内存compile time.

strarray[0]="hello";   
//here you need not to allocate memory as this is an assignment 

您需要在使用指针之前分配一些空间,destination stringstrcpy()

strcpy() 将 source 指向的 C 字符串复制到 destination 指向的数组中,包括终止的空字符(并在该点停止)。

目标指向的数组的大小应足够长,以包含与源相同的 C 字符串(包括终止的空字符),并且不应与源在内存中重叠。

为此,您需要allocate Memory first

strcpy本身不会为目标字符串分配内存

于 2013-09-13T20:18:42.360 回答