请问,这一小段运行段错误,问题在哪

bhxxdzxj 2014-07-04 08:07:00

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


void stringtest(char **a)
{

*a = (char*)malloc(sizeof(char)*100);
**a = '1';
**(a+1) = '2';
printf("function:%s\n",*a);


}


//void func(char)
int main(void)
{

char * t;
stringtest(&t);

printf("main:%s\n",t);
return 0;
...全文
236 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
初見的畫面 2014-07-08
  • 打赏
  • 举报
回复
**a = '1'; *(*a+1)='2'; 这样就可以了,**(a+1)是野指针,不能赋值。
赵4老师 2014-07-08
  • 打赏
  • 举报
回复
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
我看你有戏 2014-07-08
  • 打赏
  • 举报
回复


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


void stringtest(char **a)
{
	*a = (char*)malloc(sizeof(char)*100);   //把*a  理解为 主函数里面的t指针
	*(*a+0) = '1';
	*(*a + 1) = '2';
	*(*a + 2)  = 0;
	printf("function:%s\n",*a);



	/*
	char *t = (char*)malloc(sizeof(char)*100); 
	*(t+0)='1';
	*(t+1)='2';
	*(t+2)=0;  字符串记得加个ASCII 的0结尾  一般写成  '\0'
	*/


}

int main(void)
{

	char * t;
	stringtest(&t);

	printf("main:%s\n",t);
	return 0;
}	
一根烂笔头 2014-07-07
  • 打赏
  • 举报
回复
段错误——内存访问错误!**(a+1)非法
非自愿精神病 2014-07-07
  • 打赏
  • 举报
回复
引用 3 楼 jia_jianlei 的回复:
应该用*((*a)+1) = '2'; **(a+1) = '2';//表示将a+4地址变为一个二级指针,会非法访问内存。 a为一个二级指针,加一表示偏移一个数据类型(4个字节)。 运行结果: linux $ ./a.out 12 p: 0x9e66008 pp: 0xbfff22a8 pp + 1: 0xbfff22ac 代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int main(int argc, const char *argv[]) 6 { 7 char *p = NULL; 8 char **pp = NULL; 9 10 p = malloc(sizeof(*p)*4096); 11 bzero(p,4096); 12 13 pp = &p; 14 15 **pp = '1'; 16 *(*pp+1) = '2'; 17 printf("%s\n",p); 18 printf("p: %p\n",p); 19 printf("pp: %p\n",pp); 20 printf("pp + 1: %p\n",pp + 1); 21 22 23 free(p); 24 return 0; 25 }
谢谢!回答的很认真。
jia_jianlei 2014-07-04
  • 打赏
  • 举报
回复
应该用*((*a)+1) = '2';
**(a+1) = '2';//表示将a+4地址变为一个二级指针,会非法访问内存。
a为一个二级指针,加一表示偏移一个数据类型(4个字节)。

运行结果:
linux $ ./a.out
12
p: 0x9e66008
pp: 0xbfff22a8
pp + 1: 0xbfff22ac

代码:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main(int argc, const char *argv[])
6 {
7 char *p = NULL;
8 char **pp = NULL;
9
10 p = malloc(sizeof(*p)*4096);
11 bzero(p,4096);
12
13 pp = &p;
14
15 **pp = '1';
16 *(*pp+1) = '2';
17 printf("%s\n",p);
18 printf("p: %p\n",p);
19 printf("pp: %p\n",pp);
20 printf("pp + 1: %p\n",pp + 1);
21
22
23 free(p);
24 return 0;
25 }
Intel0011 2014-07-04
  • 打赏
  • 举报
回复
**(a+1) = '2'; ------> *(*a+1) = '2'; 另外记得释放申请的内存
bhxxdzxj 2014-07-04
  • 打赏
  • 举报
回复
第一个**a = ‘1’;不会报错 第二个**(a+1) = '2' 在这里出错

69,382

社区成员

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

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