动态内存,分别使用char类型和int类型操作的问题

mylife的博客 2016-02-25 05:32:43
#include <stdio.h>
#include <stdlib.h>
int main() {
//void *p_v = malloc(4 * sizeof(char));
void *p_v = calloc(4, sizeof(char));
char *p_str = (char *)p_v;
//printf("p_str = %p\n", p_str);
*(p_str + 3) = '0';

int *p_num = (int *)p_v;
//printf("p_num = %p\n", p_num);
printf("*p_num = %d\n", *p_num);
free(p_num);

return 0;
}


运行结果是805306368。

各位大神,问个问题,这个结果为什么不是48呀?


其中'0'的值是48。

它不是按照下面操作的吗?
00000000 00000000 00000000 00110000
str[0] str[1] str[2] str[3]
...全文
150 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mylife的博客 2016-02-29
  • 打赏
  • 举报
回复
引用 8 楼 lgbxyz 的回复:
大小端判断的函数写错了,更正一下

int get_sys_endian(void)
{
    int a = 0x12;
    char c = *(char*)&a;
     
    if (0x12 == c)
    {       
		printf("little endian\n");
        return 1;
    }
    else
    {
		printf("big endian\n");
	    return -1;   
    }
     
    return 0;
}
按照百科,低字节存放在低地址,就是小端;低字节存放在高地址,就是大端。仔细看来,其实你上面的demo也没有错,只不过上面的是用来0x1234取12的高字节判断
relaxisland 2016-02-26
  • 打赏
  • 举报
回复
这和int的内存格式有关系, x86的cpu是little endian 就是在低字节地址低位数, 高字节存放高位数 char因为只有1个字节,没有问题,就是从第到高 排列 上述例子的4个char 0x00 0x00 0x00 0x30 ------> 但是int有4个字节,作为整体,低位数放在低字节的地址,高位数放在高字节的地址, 比如你有一个数0x11223344,在内存中是这样的 44 33 22 11 因此,。。。。。。。。
LubinLew 2016-02-26
  • 打赏
  • 举报
回复
大小端判断的函数写错了,更正一下

int get_sys_endian(void)
{
    int a = 0x12;
    char c = *(char*)&a;
     
    if (0x12 == c)
    {       
		printf("little endian\n");
        return 1;
    }
    else
    {
		printf("big endian\n");
	    return -1;   
    }
     
    return 0;
}
mylife的博客 2016-02-26
  • 打赏
  • 举报
回复
引用 6 楼 lgbxyz 的回复:

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

int get_sys_endian(void)
{
	int a = 0x1234;
	char c = *(char*)&a;
	
	if (0x12 == c)
	{
		printf("big endian\n");
		return 1;
	}
	else
	{
		printf("little endian\n");
		return -1;	
	}
	
	return 0;
}

int main(void) 
{
	
	int pos = 0;
    void *p_v = calloc(4, sizeof(char));
    char *p_str = (char *)p_v;
 
 	if (get_sys_endian() == 1)
 	{
 		pos = 3;
	}
	
    *(p_str + pos) = '0';
    int *p_num = (int *)p_v;

    printf("*p_num = %d\n", *p_num);
    
    free(p_num);
    return 0;
}
执行结果是little endian,现在有些了解了
LubinLew 2016-02-26
  • 打赏
  • 举报
回复

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

int get_sys_endian(void)
{
	int a = 0x1234;
	char c = *(char*)&a;
	
	if (0x12 == c)
	{
		printf("big endian\n");
		return 1;
	}
	else
	{
		printf("little endian\n");
		return -1;	
	}
	
	return 0;
}

int main(void) 
{
	
	int pos = 0;
    void *p_v = calloc(4, sizeof(char));
    char *p_str = (char *)p_v;
 
 	if (get_sys_endian() == 1)
 	{
 		pos = 3;
	}
	
    *(p_str + pos) = '0';
    int *p_num = (int *)p_v;

    printf("*p_num = %d\n", *p_num);
    
    free(p_num);
    return 0;
}
醉花阴柳 2016-02-26
  • 打赏
  • 举报
回复
谷歌搜索大小端
mylife的博客 2016-02-25
  • 打赏
  • 举报
回复
引用 2 楼 wang0635 的回复:
0x30000000 == 805306368 0x30 == 48
为什么不是48呢,从左到右看就是110000,应该是48呀..
wang0635 2016-02-25
  • 打赏
  • 举报
回复
0x30000000 == 805306368
0x30 == 48
mylife的博客 2016-02-25
  • 打赏
  • 举报
回复

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧