请教一个指针的问题,被指针伤到了

DeDeWo 2012-08-03 09:10:07
下面这段代码在输入第二组数据时会出错

#include<stdio.h>
#include<string.h>
using namespace std;
char str[10][10],s[10];
void fun(char **str,char *s)
{
if(str[0]!=NULL)
printf("temp == %s\n",str[0]);
}
int main(){
while(scanf("%s",&s)==1)
{

fun((char**)str,s);

strcpy(str[0],s);

printf("str == %s \n",str[0]);

}

return 0;
}



而fun函数如果是空函数的话就没问题,为什么?

#include<stdio.h>
#include<string.h>
using namespace std;
char str[10][10],s[10];
void fun(char **str,char *s)
{
// if(str[0]!=NULL)
// printf("temp == %s\n",str[0]);
}
int main(){
while(scanf("%s",&s)==1)
{

fun((char**)str,s);

strcpy(str[0],s);

printf("str == %s \n",str[0]);

}

return 0;
}



...全文
223 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
smsgreenlife 2012-08-04
  • 打赏
  • 举报
回复
伤到哪里了
wizard_tiger 2012-08-04
  • 打赏
  • 举报
回复
LS都说了,学习一下!
DeDeWo 2012-08-04
  • 打赏
  • 举报
回复
明白了,非常感谢楼上各位,
ies_sweet 2012-08-04
  • 打赏
  • 举报
回复
如果希望使用二级指针来引用二维数组
那么在传递函数参数的时候,请带上数组第1维的维数
这样可以通知编译器,这个二级指针指向的是二维数组
那么在进行下标运算的时候,编译器就知道如何行动了

指针和数组还是有区别的
建议楼主搜索一下相关资料
或者可以读一本书 《C和指针》
cao_julians 2012-08-04
  • 打赏
  • 举报
回复
二级指针不能直接对应于二维数组
此例中二级指针的使用必须需要一级指针,这个一级指针提供一维数组的信息----元素个数!
调用传参时
形参str(纯二级指针变量--没有任何数组概念)由实参str(实际是&str[0])初始化,即形参str指向了实参数组的首行,后果是形参str并不知道实参数组的行数和列数,并且它将它指向位置(实参数组首行的前四个字符码值)的值当作一级指针来用!

测试:
char str[10][10]={"ABCD"};

void fun(char **str,char *s)
{
printf("%p\n",*str);//应该是ABCD的ASCII码值
}

DeDeWo 2012-08-03
  • 打赏
  • 举报
回复
还有下面这样是正确的,能否做个比较?

#include<iostream>
#include<cstring>
using namespace std;
void fun(char **str){
printf("%s\n",str[0]);
}
int main(){
char **str;
str=new char*[10];

for(int i=0;i<10;i++)
str[i]=new char[10];

char s[10];
while(scanf("%s",s)==1){

strcpy(str[0],s);

fun(str);
}

system("pause");
return 0;
}



DeDeWo 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

二维数组不等于二级指针

void fun(char **_str,char p[][10],char *s)
{
printf("%s",_str[0]); //错
printf("%s",p[0]); //对
return;
}

fun((char**)str,str,s);

二级指针_str指向的是整个数组
p指向的是第一行
虽然地……
[/Quote]

请问是怎么解析str和str[0]的?
躺枪同学 2012-08-03
  • 打赏
  • 举报
回复
原来str[0]根本就是错的啊! 学习了!
ganmaojiushijiu 2012-08-03
  • 打赏
  • 举报
回复
str是二级指针,你传入str的时候是二级指针本身啊!这怎么一样呢
IVERS0N 2012-08-03
  • 打赏
  • 举报
回复
二维数组不等于二级指针

void fun(char **_str,char p[][10],char *s)
{
printf("%s",_str[0]); //错
printf("%s",p[0]); //对
return;
}

fun((char**)str,str,s);

二级指针_str指向的是整个数组
p指向的是第一行
虽然地址都一样 但是解析范围不一样

一样道理
char str[10][10];
char **k = (char**) str;
strcpy(str[0],"123");
printf("%s",str[0]); //对
printf("%s",k[0]); //错

躺枪同学 2012-08-03
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>

char g_Str[10][10], g_S[10];

void fun(char **str)
{
if(str[0]!= NULL)
printf("temp == %s\n", *(str[0]));
}

int main(){
while(scanf("%s", &g_S) == 1)
{
fun((char **)g_Str);
strcpy(g_Str[0], g_S);
printf("str == %s \n", g_Str[0]);
}
return 0;
}

LZ,你这问题真难住我了!
DeDeWo 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

尼玛,其实我也不懂啊!


看了下内存,如果你输入"aaaa",在内存里放的就是61 61 61 61,在第二次进函数的时候,str[0]的地址成了0x61616161,str[0]的值是找不到的。
[/Quote]

对,我正纠结这个问题,为什么 char **str ; str 和 str[0] 的地址不一样么?
躺枪同学 2012-08-03
  • 打赏
  • 举报
回复
尼玛,其实我也不懂啊!


看了下内存,如果你输入"aaaa",在内存里放的就是61 61 61 61,在第二次进函数的时候,str[0]的地址成了0x61616161,str[0]的值是找不到的。
DeDeWo 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

C/C++ code

#include <stdio.h>
#include <string.h>

char str[10][10],s[10];
void fun(char **str,char *s)
{
if(str[0]!=NULL)
printf("temp == %s\n",str); // 楼主自己看下这一行与你的有什么区别
}
int main……
[/Quote]

改成输出str确实可以了,但请教这里 str[0]和str 不一样么
躺枪同学 2012-08-03
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>

char str[10][10],s[10];
void fun(char **str,char *s)
{
if(str[0]!=NULL)
printf("temp == %s\n",str); // 楼主自己看下这一行与你的有什么区别
}
int main(){

while(scanf("%s",&s)==1)
{
fun((char **)str,s);
strcpy(str[0],s);
printf("str == %s \n",str[0]);
}
return 0;
}


DeDeWo 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

为什么你要用二级指针?
[/Quote]

我知道可以这样传递 char (*str)[10]; 这样是没错的,但我想知道出现上面那种情况的原因是什么
yfl819586803 2012-08-03
  • 打赏
  • 举报
回复
char **str,这里二级指针其实就是二维数组,应该用str[i][j]
躺枪同学 2012-08-03
  • 打赏
  • 举报
回复
为什么你要用二级指针?
DeDeWo 2012-08-03
  • 打赏
  • 举报
回复
而一维的数组就不会出现这种问题

#include<stdio.h>
#include<string.h>
char str[10],s[10];
void fun(char *str,char *s)
{
if(str!=NULL)
printf("temp == %s\n",str);
}
int main(){
while(scanf("%s",s)==1)
{

fun((char*)str,s);

strcpy(str,s);

printf("str == %s\n",str);

}

return 0;
}


69,369

社区成员

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

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