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

C语言 码拜 9年前 (2016-02-01) 1093次浏览
#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。
动态内存,分别使用char类型和int类型操作的问题
各位高手,问个问题,这个结果为什么不是48呀?
动态内存,分别使用char类型和int类型操作的问题
其中””0″”的值是48。
它不是按照下面操作的吗?
00000000 00000000 00000000 00110000
str[0]   str[1]   str[2]   str[3]

解决方案:10分
这和int的内存格式有关系,
x86的cpu是little endian 就是在低字节地址低位数, 高字节存放高位数
char原因是只有1个字节,没有问题,就是从第到高 排列
上述例子的4个char
0x00 0x00 0x00 0x30
–>
但是int有4个字节,作为整体,低位数放在低字节的地址,高位数放在高字节的地址,
例如你有一个数0x11223344,在内存中是这样的 44 33 22 11
因此,。
解决方案:5分
谷歌搜索大小端
解决方案:5分
#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;
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明动态内存,分别使用char类型和int类型操作的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)