在C中mallocing字符串

时间:2017-01-23 10:32:07

标签: c char malloc heap

我不太确定malloc如何正常工作。

#include <stdio.h>
#include <stdlib.h>

int main() {

 char * string = (char*) malloc(sizeof(char));
 string = "abc";

 int * test = (int*) malloc(1 * sizeof(int));
 *(test) = 5;
 *(test + 1) = 6;


}

我预计这会输出一个错误,因为我指定给string的值大于一个char但它似乎编译得很好。

我有几个问题:

  1. 现在会保存'字符串'在哪里?在我分配的一个空间之后它是在堆上的内存空间吗?

  2. 为什么char让我直接指定而只通过指针指定int?

  3. 我真的不确定我在这里做什么

6 个答案:

答案 0 :(得分:3)

此代码

string = "abc";

将字符串常量"abc"的地址分配给string变量,即char *。您malloc()来电时返回的内存地址(string)会被覆盖并丢失。

答案 1 :(得分:1)

  

&#39;字符串&#39;现在被救了?

PermissionHandler

char * string = (char*) malloc(sizeof(char)); string = "abc"; 现在指向&#34; abc&#34; (文字字符串) - 初始动态分配(在堆中)已丢失跟踪并且您有内存泄漏。

答案 2 :(得分:1)

除了其他答案:

你可能想要这个:

char *string = (char*) malloc(sizeof(char) * 100);  // allocate space for 100 chars
strcpy(string, "abc");  // copy the "abc" into the memoory location pointer by string

而不是:

char *string = (char*) malloc(sizeof(char));   // << this allocates only a single char
string = "abc";

*(test) = 5;
*(test + 1) = 6;

最好写成:

test[0] = 5;
test[1] = 6;

这是严格等同的,只是可读性问题。

分配的内存太少:

如果你只为1个字符分配内存:

char *string = (char*) malloc(sizeof(char));  // allocate space 1 char
strcpy(string, "abc");  // copy the "abc" into the memoory location pointer by string

然后你的程序仍然可以正常编译,但在运行时,字符串将被部分复制到未分配的内存,这会导致未定义的行为(谷歌&#34;未定义的行为&#34;)。

答案 3 :(得分:0)

我会给你一个真实的例子。

假设A先生住在地址“abc”。现在,一些B先生开始住在“xyz”的某个地址。很快,B先生地址“xyz”更名为“abc”。现在,如果你去地址“abc”,你会遇到B先生,而不是A先生。但是,这并不意味着A先生被拆除了。这只是意味着A先生的生活区域现在没有可到达的地址而且丢失了。

同样,您malloc'编辑到string然后将string重新分配给“abc”的内存,意味着,string之前有一个地址malloc'内存。之后,您的“abc”将写入某个内存,该内存的地址将存储在string中。因此,永远丢失malloc'内存,称为内存泄漏。

答案 4 :(得分:0)

编译器不会阻止您执行允许的操作 - 但是您可能会收到1的警告,因为dictionary["£7"]["50"]已分配,在重新分配之前未使用(假设编译器)要求输出相关警告。)

对于2),你调用一个恰好是string的函数,其参数恰好对于你想用malloc返回的指针的用法来说太小了,但是由于语法正确,编译器不会抱怨。

回答

1)malloc指向string,而"abc"的前一个值丢失

2)你也可以做malloc

2)的行为是未定义的行为(访问数组越界)。

答案 5 :(得分:0)

首先,分配了动态内存,请求大小为一个字符。

char * string = (char*) malloc(sizeof(char));

然后指针被重新分配字符串文字“abc”的第一个字符的地址。

string = "abc";

结果,动态分配的内存的地址丢失,程序中存在内存泄漏。

如果程序是用C ++编写的,那么这个语句

string = "abc";

可能出现编译器诊断消息,因为C ++中的字符串文字具有常量字符数组的类型,并且指针string被声明为

const char *string;

对于字符串文字,它们具有静态存储持续时间,并在main获取控件之前分配。通常所有字符串文字都是所谓的字符串文字池中的位置。

而不是这句话

string = "abc";
你可以写

strcpy( string, "abc" );

在这种情况下,程序具有未定义的行为。但是,由于函数malloc通常将最小内存范围分配给等于16字节的段落值,因此它可以继续成功运行。