1. 环境为32位机 (int 占4Bytes)下,运行如下代码。请问输出什么,为什么?
int a = 0x1234;
char * p = (char *) &a;
printf("0x%x\n", (int)*p);printf("0x%x\n", (int)*(p+1));
printf("0x%x\n", (int)*(p+2));
答:这个题涉及大端与小端存储的问题 https://www.cnblogs.com/still-smile/p/11595775.html
Big-Endian和Little-Endian的定义如下:
1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:
1)大端模式:
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
可见,大端模式和字符串的存储模式类似。
2. 请找出下面代码中的所有错误 说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
#include"string.h"
int main() {
char*src="hello,world";
char* dest=NULL;
int len=strlen(src);
dest=(char*)malloc(len);
char* d=dest;
char* s=src[len];
while(len--!=0)
d++=s--;
printf("%s",dest);
return 0;
}
答:字符串其实是后面有个'\0'的,通过这个来识别字符串,所以开辟的空间不够,并且src[len] 是指向了'\0',不能放置之后的第一个字节,
3. 请找出下面代码中的所有错误
void GetIntA(int *p)
{
p = malloc(sizeof(int)); // 这里p是传值进来的,开辟空间后,外部调用的指针不会被更改,应该使用指针的指针或者指针的引用,int * &p 或者int **p
return;
}
int * GetIntB()
{
int kk; // 栈的局部变量,这个是不能返回的,最简单的方法就是把int kk移动到函数外面,或者加上static
return &kk;
}
void main(void)
{
int *p;
p = NULL; GetIntA(p); *p = 0x22;
p = NULL; p = GetIntB(); *p = 0x33;
}
答:见注释
4. 环境为32位机 (int 占4Bytes)下
int a = (int)(((int *)0)+4); a等于多少?为什么?
0作为一个地址使用,转为int *,也就是一个指针4个字节,指针移动4个位置,就是地址指向16,然后把地址按整数变成a输出;
5. //64位机,linux环境,物理内存16G
void foo()
{
int n = 0;
while(true){
void * p = malloc(1*1024*1024);
if(NULL == p) break;
n += 1;
}
}
答:每次开辟1M字节,涉及用户态的程序有多大的地址空间,32位机,默认是4G,给用户可以用的大概是3G,
编程题:用c语言写一个函数,把字符串里面的空格全部去掉,并返回删除的空格的个数,不允许新开辟空间,只能申请简单类型的自动变量。时间复杂度O(n)
int del_blanks(char * str);
"I am a worker" ---> "Iamaworker"
char * test = "I am a worker";
char test[] = "I am a worker";
答:
#include <iostream>
#include"string.h"
using namespace std;
int del_blanks(char * str)
{
int n = strlen(str);
int count = 0;
int index = 0;
int cur = 0;
for (index=0; index<n; )
{
// 找cur下标的为空格
while (str[cur] != ' ')
{
index ++;
cur ++;
}
// 跳过空格
while (str[index] == ' ')
{
index ++;
count ++;
}
while ( str[index]!= ' ')
{
str[cur] = str[index];
cur ++;
index ++;
}
cur = index;
}
str[cur] = '\0';
return count;
}
int main() {
//int a;
//cin >> a;
char test[100] = "I am a worker" ;
int result = del_blanks(test);
cout << "删除空格个数:" << result << ", " << test << endl;
}