[求助]一道关于指针数组方面的问题
大家好!这道题是输入10个不等长的字符串排序输出.
我已查阅了本站的相关,旧贴些许收获,但尚有一些不明,尤其是我的程序开始的时候编译成功,但运行有的字符串就会找不到指针,后来我用论坛旧贴的方法也就是用到了着几个函数
malloc(sizeof(char)*20);
free();
getch();
用后实现其功能了,后来我把这几函数又给删除了,不过仍然可以实现功能,不知为何?
我是初学问题之拙绌,勿怪,望此站之仁人志士不吝赐教,并给予充分解答,并告之一些指针数组相关注意事项,感激涕泠!!
以下是我的程序:
main()
{
char *str[10];
int i;
void sort();
printf("input 10 string:\n");
for(i=0;i<10;i++)
scanf("%s",str[i]);
sort(str);
printf("the sort string:\n");
for(i=0;i<10;i++)
printf("%s\n",str[i]);
}
void sort(str)
char *str[10];
{
char *p;
int i,j,k;
for(i=0;i<9;i++)
{ k=i;
for(j=i+1;j<10;j++)
if(strcmp(str[k],str[j])>0) k=j;
p=str[i],str[i]=str[k],str[k]=p;
}
}
{
char *str[10];
int i;
void sort();
printf("input 10 string:\n");
for(i=0;i<10;i++)
scanf("%s",str[i]);
sort(str);
printf("the sort string:\n");
for(i=0;i<10;i++)
printf("%s\n",str[i]);
}
void sort(str)
char *str[10];
{
char *p;
int i,j,k;
for(i=0;i<9;i++)
{ k=i;
for(j=i+1;j<10;j++)
if(strcmp(str[k],str[j])>0) k=j;
p=str[i],str[i]=str[k],str[k]=p;
}
}
[此贴子已经被作者于2006-5-5 4:20:36编辑过]
----------------解决方案--------------------------------------------------------
有的编译器也许可以运行 ,严格来说是错的
因为你光有个指针,给你一堆字符你没处放啊
----------------解决方案--------------------------------------------------------
我的VC6。0不行,运行没错误,输入就有问题了!
----------------解决方案--------------------------------------------------------
char *str[10];
scanf ("%s", str[i]);......
晕倒!新手最容易犯的错误之一,呵呵。
char *str[10] 定义了一个指针数组,含有十个指向整形变量的指针元素。由于是在栈空间(stack),里面的内容不会被自动初始化,所以 str[i] (0 <= i <= 9)值随机,即*str[i]指向随机地址。
如果这些地址刚好都没有被系统使用(请注意,这里我只是为描述简单起见,笼统使用了“没有被系统使用”,你如果想知道详细细节,要了解操作系统内存管理知识),那么scanf("%s", str[i])没任何问题。但是如果刚好str[i]指向某个特殊区间(如系统内存区,只读区,其他变量地址等)就会导致程序崩溃,异常推出或程序结果错误。
要改也很简单:
char *str[10];
for (i = 0; i < 10; i++)
{
str[i] = (char *) malloc (20); //实际编程中20应该用宏定义代替
}
最后程序尾记得释放内存,不然就内存泄漏了。
----------------解决方案--------------------------------------------------------
以下是引用hqx在2006-5-5 5:40:00的发言:
char *str[10];
scanf ("%s", str[i]);......
晕倒!新手最容易犯的错误之一,呵呵。
char *str[10] 定义了一个指针数组,含有十个指向整形变量的指针元素。由于是在栈空间(stack),里面的内容不会被自动初始化,所以 str[i] (0 <= i <= 9)值随机,即*str[i]指向随机地址。
如果这些地址刚好都没有被系统使用(请注意,这里我只是为描述简单起见,笼统使用了“没有被系统使用”,你如果想知道详细细节,要了解操作系统内存管理知识),那么scanf("%s", str[i])没任何问题。但是如果刚好str[i]指向某个特殊区间(如系统内存区,只读区,其他变量地址等)就会导致程序崩溃,异常推出或程序结果错误。
char *str[10];
scanf ("%s", str[i]);......
晕倒!新手最容易犯的错误之一,呵呵。
char *str[10] 定义了一个指针数组,含有十个指向整形变量的指针元素。由于是在栈空间(stack),里面的内容不会被自动初始化,所以 str[i] (0 <= i <= 9)值随机,即*str[i]指向随机地址。
如果这些地址刚好都没有被系统使用(请注意,这里我只是为描述简单起见,笼统使用了“没有被系统使用”,你如果想知道详细细节,要了解操作系统内存管理知识),那么scanf("%s", str[i])没任何问题。但是如果刚好str[i]指向某个特殊区间(如系统内存区,只读区,其他变量地址等)就会导致程序崩溃,异常推出或程序结果错误。
关注这位hqx学长的帖子,可能是高手牛人!
----------------解决方案--------------------------------------------------------
学到了知识啊
----------------解决方案--------------------------------------------------------
我不同意hqx下列说法“最后程序尾部得释放内存,不然就内存泄漏了。”因为正常结束时操作系统会收回某个“进程”当初向她“借用”的一切资源。这方面可以查阅一下任何链表代码,有哪个“临终”时用free( )的?欢迎争鸣。
----------------解决方案--------------------------------------------------------
呵呵,我们用,不好意思,这是个习惯。
有时候还编个Free函数.
虽然程序结束后会释放,如果以后做项目的话,这个程序就可能一直运转了,这下就惨啦!
----------------解决方案--------------------------------------------------------
谢谢4楼的详细解释,也同样谢谢来这里的其他人
关于开辟内存我又查了几种形式不知道有和区别,希望能再次得到大家的宝贵意见
有这样一个程序段:
char *a="Word";
char *p = (char *)malloc(sizeof(char)*(strlen(a)+1));
cout<<p<<endl;char *p = (char *)malloc(sizeof(char)*(strlen(a)+1))
char *p = (char *)malloc(sizeof(char)*strlen(a))
char *p = (char *)malloc((strlen(a)+1))
char *p = (char *)malloc(strlen(a))
char *p = (char *)malloc(sizeof(a))
----------------解决方案--------------------------------------------------------
以下是引用soft_wind在2006-5-5 10:07:00的发言:
呵呵,我们用,不好意思,这是个习惯。
有时候还编个Free函数.
虽然程序结束后会释放,如果以后做项目的话,这个程序就可能一直运转了,这下就惨啦!
呵呵,我们用,不好意思,这是个习惯。
有时候还编个Free函数.
虽然程序结束后会释放,如果以后做项目的话,这个程序就可能一直运转了,这下就惨啦!
我又发“犟劲”了。请回忆一下,你那链表程序末尾释放内存时,是一个free()语句呢,还是用遍历呀?如果光一个free(head)是根本不管用的,对吧?只怕是一般的结构体数组吧,那才能一个free()搞定哩。
----------------解决方案--------------------------------------------------------