hur.cn - 华软网

 热门搜索

malloc 问题

  作者:未知    来源:网络    更新时间:2011/9/28
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
char *pszFilePath = (char *)malloc(8);
UINT uiLength = (UINT)strlen(pszFilePath);
return EXIT_SUCCESS;
}

调试到最后一行:
pszFilePath = "屯屯屯屯铪铪";
uiLength = 24。

为什么是 24,fread(pszFilePath, 8, 1, pFile) 后长度也是 24,如果不打断字符串没有其他方法了吗。?
---华软 网友回答---
char *pszFilePath = (char *)malloc(8);
分配后,没有初始化
UINT uiLength = (UINT)strlen(pszFilePath);
试图获得字符串的长度,直到找到结束符
---华软网友回复---
引用 1 楼 ouyh12345 的回复:
char *pszFilePath = (char *)malloc(8);
分配后,没有初始化
UINT uiLength = (UINT)strlen(pszFilePath);
试图获得字符串的长度,直到找到结束符


可是我分配大小为 1,在 strcpy 复制一个长度为 12 的字符串也不会越界……
---华软网友回复---
找本书看看……
---华软网友回复---
看看msdn  或许有答案  或者百度  呵呵
---华软网友回复---
UINT uiLength = (UINT)strlen(pszFilePath);
这里这行代码是非常危险的。

在malloc后,没有初始化指针所指向的内存数据。好在有操作系统给你保护。否则后果可能很严重。

strlen是不会判断你传入的指针是否有效的,他只做while和计数,找到'\0',就返回。

strcpy也是一样。它不会判断内容是否有效,只按你所指定的长度,进行拷贝。

不会越界,因为整个地址范围,都在你的应用程序中。如果你不控制好它,小程序或者就罢了,程序一大,错了都不知道去哪里找。
---华软网友回复---
把char* 改成 wchar_t *
---华软网友回复---
100%越界了,只不过系统没有发现罢了,因为堆默认有1MB,对于你都是可写的,但是这样做脱离了系统对堆的管理,和不清空使用字符串一样,结果是无法预测的。你可以malloc两块,那样写第一个,看会不会覆盖第二个。
---华软网友回复---
引用 5 楼 tearywang 的回复:
UINT uiLength = (UINT)strlen(pszFilePath);
这里这行代码是非常危险的。

在malloc后,没有初始化指针所指向的内存数据。好在有操作系统给你保护。否则后果可能很严重。

strlen是不会判断你传入的指针是否有效的,他只做while和计数,找到'\0',就返回。

strcpy也是一样。它不会判断内容是否有效,只按你所指定的长度,进行拷贝……


那我只能读完后在字符串结尾 = '\0' 了吗。?
---华软网友回复---
引用 7 楼 bokutake 的回复:
100%越界了,只不过系统没有发现罢了,因为堆默认有1MB,对于你都是可写的,但是这样做脱离了系统对堆的管理,和不清空使用字符串一样,结果是无法预测的。你可以malloc两块,那样写第一个,看会不会覆盖第二个。


malloc 分配的地址是可以随意越界的。?
之前我记得分配完指定大小越界后就会出错。
---华软网友回复---
引用 6 楼 liyu1128 的回复:
把char* 改成 wchar_t *


这不是解决问题的好方法吧。?
---华软网友回复---
引用 1 楼 ouyh12345 的回复:
char *pszFilePath = (char *)malloc(8);
分配后,没有初始化
UINT uiLength = (UINT)strlen(pszFilePath);
试图获得字符串的长度,直到找到结束符

的确是的。

---华软网友回复---
如果一般应用开发,少用c的字符串函数,多用std::string ,CString也行啊。何必这么苦逼
---华软网友回复---
引用 5 楼 tearywang 的回复:
UINT uiLength = (UINT)strlen(pszFilePath);
这里这行代码是非常危险的。

在malloc后,没有初始化指针所指向的内存数据。好在有操作系统给你保护。否则后果可能很严重。

strlen是不会判断你传入的指针是否有效的,他只做while和计数,找到'\0',就返回。

strcpy也是一样。它不会判断内容是否有效,只按你所指定的长度,进行拷贝。……

我也这么认为.
---华软网友回复---
引用 12 楼 yangyam 的回复:
如果一般应用开发,少用c的字符串函数,多用std::string ,CString也行啊。何必这么苦逼


感觉那种包装不给力 = =……
---华软网友回复---
引用 13 楼 ardourcareful 的回复:
引用 5 楼 tearywang 的回复:
UINT uiLength = (UINT)strlen(pszFilePath);
这里这行代码是非常危险的。

在malloc后,没有初始化指针所指向的内存数据。好在有操作系统给你保护。否则后果可能很严重。

strlen是不会判断你传入的指针是否有效的,他只做while和计数,找到'\0',就返回。

strcpy也是一样。它不会……


没看过书各种压力……
---华软网友回复---
malloc完了之后一定要memset一下
还有~~malloc用完了记得free
---华软网友回复---
char *pszFilePath = (char *)malloc(8);
只是在堆里面申请了空间,没有写任何东西进去,其内存为随机值

退出之前,应该使用free释放申请的空间,否则会造成内存泄漏
---华软网友回复---
引用 8 楼 m407039340 的回复:
引用 5 楼 tearywang 的回复:

UINT uiLength = (UINT)strlen(pszFilePath);
这里这行代码是非常危险的。

在malloc后,没有初始化指针所指向的内存数据。好在有操作系统给你保护。否则后果可能很严重。

strlen是不会判断你传入的指针是否有效的,他只做while和计数,找到'\0',就返回。

strcpy也是一样。它……

这个和压力没有关系,这里讲的是程序强调的是程序模块,当你的程序中,函数足够多时,你不知道是哪个函数里的错误操作,导致程序中的某个部分的内存破坏。

对于char*,如,char* p = (char*)nalloc(10);,你至少应该这样:p[10-1] = '\0';确保是安全的。
通常,这样可能会更好一点,memset(p, 0, sizeof(char)*10);这条语句初始化整块刚malloc的内存,千万别越界。
---华软网友回复---
内存分配,访问越界与保护:
对于操作系统来说,系统是一代比一代强,保护是一代比一代好,现在的操作系统基本都有越界保护。但总是美中不足。
内存分配:
当一个进程启动时,操作系统为其分配内存(堆、栈),操作系统记录了已经分配的区域。当当前程序访问不属于自己标识的内存块时,将发生访问越界。注意,访问的是非常程序标识的内存,这个越界错误是系统抛出的。那么对于操作系统分配给当前程序的内存,又是如何处理的?每个程序自己管理自己的这一大块内存,并分配给各个函数,变量使用。当程序内发生访问越界时,假如你做了自己的内存管理,那你能知道,否则没人知道,因为操作系统认为,你访问的还是那块与你进程相关的空间,直到无法预期的异常发生,这些异常,通常发生在内存状态上,通常由系统保护检测出。
---华软网友回复---
分配内存,不初始化是很危险的。
---华软网友回复---
没清0啊
---华软网友回复---
非常不好意思,28 号我网到期了。。
今天来网吧结的此贴……      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。