100分求解简单c语言题(1)
1)谁指点下,书上的习题(要步骤,人工计算)
设有两个算法在同一机器上运行,其执行时间分别为100n^2和2^n,要使前者快于后者,n至少要多大?
100n^2 < 2^n, 可这怎么解啊?
(to ammana_babi(郑诤):
不好意思,浪费你宝贵时间,能写出步骤(具体演算)(不要用程序解)?我这也有答案,但我需要的是步骤哦。)
2.1)malloc函数问题,malloc(0)分配0字节后,指针会指向哪里呢?谁解释下,可以这样用吗,因为数据结构中有空表,空栈的定义,所以才这样问。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p;
printf( "%d\n ", p);
if ((p = (int *)malloc(0)) == NULL)
{
exit(1);
}
printf( "%d\n ", p);
return 0;
}
2.2)用malloc(0)分配0个字节,为什么该函数还返回了一个地址?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p = NULL;
printf( "First: %d\n ", p);
if ((p = (int *)malloc(0)) == NULL)
{
printf( "内存不足\n ");
exit(1);
}
printf( "Second: %d\n ", p);
return 0;
}
2.3)详细介绍malloc和free的资料,书籍,教程,或个人经验,建议也行。
3)
#include <stdio.h>
#include <stdlib.h>
struct MyStruct
{
char ch;
double di;
float fj;
};
int main(void)
{
//下面那句换成 (vc6.0)
//struct MyStruct stu = { 'A ', 12.34, 45.67};
//就会有警告,是不是又跟数据在内存中的存储形式有关?
struct MyStruct stu = { 'A ', 12.34, 45.67f};
return 0;
}
4)创建空链表,下面哪些方法是正确的呢?如果错,错在哪?(后面这个问题是重点,要回答哈)或者你认为应该怎么创建才是正确的?
1)
#include <stdio.h>
#include <stdlib.h>
struct alist
{
int data;
struct alist *next;
};
typedef struct alist *link;
int main(void)
{
link L = NULL;//第一种,直接置为 NULL
return 0;
}
2)
#include <stdio.h>
#include <stdlib.h>
struct alist
{
int data;
struct alist *next;
};
typedef struct alist *link;
int main(void)
{
int size;
link L;
scanf( "%d ", &size);//这里假设输入是 零
if ((L = (link)malloc(size * sizeof(struct alist))) == NULL)
{
printf( "内存不足\n ");
exit(1);
}
return 0;
}
[解决办法]
malloc(0)返回一个地址,对应的内存大小是1个字节,这是特殊规定
[解决办法]
1) 一下子没想到有什么好方法,过会看看
2)
C99标准(ISO/IEC 9899:1999 (E))上说:
If the size of the space requested is zero, the behavior is implementationdefined:
either a null pointer is returned, or the behavior is as if the size were some
nonzero value, except that the returned pointer shall not be used to access an object.
如果所请求的空间大小为0,其行为由库的实现者定义:可以返回空指针,也可以让效果跟申请某个非0大小的空间一样,所不同的是返回的指针不可以被用来访问一个对象。
在vs2005上
void * p = malloc(0);
p得到一个地址,但不能用来存储任何东西,因为它大小为 0
至于上面有人说是 1,那就不知道了,或许某些编译器上是吧
在vs2005 大小是 0
void * p1 = malloc(0);
cout < <_msize(p1) < <endl;
返回大小 0
void * p1 = malloc(1);
cout < <_msize(p1) < <endl;
返回大小 1
一篇关于malloc free 的文章
3)
45.67 后面不带f的话,在vc中是 dobule 所以你把它赋给float会有警告
45.67f 就好了
4)
空连表,这样就可以了
link L = NULL;
.2
改改
int main(void)
{
int size;
link L = NULL;
scanf( "%d ", &size);//这里假设输入是 零
if (size > 0)
{
if ((L = (link)malloc(size * sizeof(struct alist))) == NULL)
{
printf( "内存不足\n ");
exit(1);
}
}
else
{
printf( "输入错误,连表大小必须大于0 ")
}
return 0;
}
[解决办法]
#include <stdio.h>
#include <stdlib.h>
struct MyStruct
{
char ch;
double di;
float fj;
};
int main(void)
{
//下面那句换成 (vc6.0)
//struct MyStruct stu = { 'A ', 12.34, 45.67};
//就会有警告,是不是又跟数据在内存中的存储形式有关?
struct MyStruct stu = { 'A ', 12.34, 45.67f};
return 0;
}
我一直都使用VC6.0
你的这个程序在VC6.0上应该这样写才行
#include <stdio.h>
#include <stdlib.h>
struct MyStruct
{
char ch;
double di;
float fj;
};
int main(void)
{
//下面那句换成 (vc6.0)
//struct MyStruct stu = { 'A ', 12.34, 45.67};
//就会有警告,是不是又跟数据在内存中的存储形式有关?
struct MyStruct stu = { 'A ', 12.34, (float)45.67};
return 0;
}
45.67这么写是默认的double类型
VC6.0里 带小数点的数字
没有严格声明的
都是默认的double类型