我不太确定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但它似乎编译得很好。
我有几个问题:
现在会保存'字符串'在哪里?在我分配的一个空间之后它是在堆上的内存空间吗?
为什么char让我直接指定而只通过指针指定int?
我真的不确定我在这里做什么
答案 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字节的段落值,因此它可以继续成功运行。