码迷,mamicode.com
首页 > 其他好文 > 详细

C Language Study - 内存分配的一个奇异之处

时间:2015-03-03 16:41:36      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

在复制字符串的时候,出现如下难以理解之处:

测试程序的目的是定义一个指针指向字符串常量,并且将这个字符串常量复制到另一个经过内存分配的字符串指针。

正常理解范围(1):

#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main(void)
{
    char* p1 = "abcdefg";
    char* p2 = (char*)malloc(sizeof(p1));//pass
    strcpy(p2,p1);
    printf("%s",p2);
    return 0;
}
正常理解范围(2):
#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main(void)
{
    char* p1 = "abcdefg";
    char* p2 = (char*)malloc(sizeof(char)*strlen(p1)+sizeof('\0'));//pass
    strcpy(p2,p1);
    printf("%s",p2);
    return 0;
}
本应该出错的程序:

#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main(void)
{
    char* p1 = "abcdefg";
    char* p2 = (char*)malloc(sizeof(char)*strlen(p1));//pass
    strcpy(p2,p1);
    printf("%s",p2);
    return 0;
}
由于p1字符串常量的内存大小还包括一个 ‘\0‘ 字符。所以分配内存的时候缺少了一个字节。本应该报错。但是在Code::Blocks(GCC) Visual C++ 6.0中测试,均无异常情况。

再做一个测试:

#include <stdio.h>
#include <string.h>
#include <malloc.h>


int main(void)
{
    char* p1 = "abcdefg";
    char* p2 = (char*)malloc(sizeof(char));//pass
    strcpy(p2,p1);
    printf("%s",p2);
    return 0;
}

程序照样正确运行!瞬间凌乱了~


我决定再做一个测试:

#include <stdio.h>
#include <string.h>
#include <malloc.h>


int main(void)
{
    char* p1 = "abcdefg";
    char* p2 = (char*)malloc(0);//pass
    strcpy(p2,p1);
    printf("%s",p2);
    return 0;
}

程序还是正确运行!

技术分享

目前为止,不知道原因。待续。

C Language Study - 内存分配的一个奇异之处

标签:

原文地址:http://blog.csdn.net/oimchuan/article/details/44039007

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!