2017-01-23 77 views
-2

我不太确定我得到如何malloc完全工作。mallocing字符串在C

#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; 


} 

我预计到输出错误,因为我指定字符串的值是不是只有一个字符更大但似乎编译就好了。

我有几个问题:

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

  2. 为什么字符让我直接指定int只能通过指针?

我真的不知道我在做什么这里

+1

为什么你[铸造的malloc的返回值(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)? – PaulMcKenzie

+0

@PaulMcKenzie我跟随MIT开放课程和所使用的PPT例如这一点,但您的权利,这似乎非常愚蠢的,感谢您的额外信息 – DarkInc

+0

'*(测试+ 1)= 6;'写出界 –

回答

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 

那么你的程序仍然会编译罚款,但在运行时字符串将部分复制到未分配的内存,这会导致未定义的行为(谷歌“未定义的行为”)。

+0

编程的几个小项目,但我只为其分配一个字符空间,那岂不是可以再当我为另一个变量分配空间,以保持“bc \ 0”的地址将被覆盖?编辑:是啊,你回答之前,我的意见是成品感谢 – DarkInc

+0

@DarkInc看到编辑答案 –

+0

魔术数字是非常不好的做法。以坏习惯开始开发新程序员是一个坏主意。 –

1

会在哪里“串”现在得救?

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

string现在指向“ABC”(一个文本字符串) - 最初的动态分配(在堆)中已经丢失的轨道,你有内存泄漏。

3

此代码

string = "abc"; 

将字符串常量​​到string变量,它是一个char *的地址。您的malloc()调用返回的内存地址(string)会被覆盖并丢失。

0

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

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

同样,存储你malloc“版,以string,然后重新分配给string‘ABC’,是指,string早些时候曾一个地址malloc”版内存。稍后,将“abc”写入某个存储器,并将该存储器的地址存储在string中。因此,永远失去了被称为内存泄漏的编辑内存。

0

编译器不会阻止你做一些允许的操作 - 但是你可能会得到1)的警告,因为string被分配并且在被重新分配之前没有被使用(假设编译器被请求输出相关警告)。

至于2),你调用的函数碰巧是malloc,它的参数碰巧对于你想用malloc返回的指针的用法来说太小,但由于语法是正确的,编译器不会抱怨。

答到

1)string点​​和malloc以前的值丢失

2)你可以做test[0] = 5;为好。

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

0

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

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

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

string = "abc"; 

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

如果程序将用C++编写然后此语句

string = "abc"; 

可能产生一个编译器诊断消息,因为在C字符串文字++有类型的恒定字符阵列和指针的string shuld声明如下

const char *string; 

至于字符串文字,则它们具有静态存储持续时间,并在主获得控制权之前分配。通常所有字符串文字都是所谓的字符串文字池中的地方。

而是这种说法

string = "abc"; 

,你可以写

strcpy(string, "abc"); 

在这种情况下,程序是未定义行为。但由于通常功能malloc分配的最小内存范围等于等于16个字节的段的值,因此它可以继续成功工作。

+0

这是一个C问题。 C++代码的行为是无关紧要的 –

+0

@ M.M没有任何“不相关的”信息。在C 1中)指针也可以用qualificator const声明,在C中可以使用与C++中相同的方法; 2)在C和C++中对同一构造进行任何比较都非常有用,有助于理解更好的C和C++。 –