首页 新闻 会员 周边

字符数组和字符指针的问题

0
悬赏园豆:20 [待解决问题]

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

#define OK 1 #define ERROR 0 #define OVERFLOW -2

#define MAXSIZE 100

typedef struct Node{  char *s;  struct Node *next; }LNode,*LinkList;

void RCreateList_L(LinkList L) //逆序建表 {  char str[MAXSIZE];  scanf("%s",&str);  while(strcmp(str,"end") != 0)  {   LinkList p = (LinkList) malloc (sizeof(LNode));   if(!p) exit(-1);   p->s = str;   p->next = L->next;   L->next = p;   scanf("%s",&str);  } }

void PrintList_L(LinkList L) {  LinkList p = L->next;  while(p != NULL)  {   printf("%s\n",p->s);   p = p->next;  } }

void main() {  LNode L;  L.s = NULL;  L.next = NULL;  RCreateList_L(&L);  PrintList_L(&L); }

 

总是输出烫烫烫,但下面的却是正确的????求大牛啊!!指导下小弟。感激不尽。

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

typedef struct Node{  char *s;  struct Node *next; }LNode,*LinkList;

void main() {  char str[100];  scanf("%s",&str);  LinkList L = (LinkList) malloc (sizeof(LNode));  L->s = str;  printf("%s",L->s); }

Sole_cc的主页 Sole_cc | 初学一级 | 园豆:71
提问于:2012-06-23 15:50
< >
分享
所有回答(4)
0

字符串是文字常量,不能够修改

所以这样 scanf("%s",&str);是不对的吧

需要用到字符串拷贝函数

strcpy();

半分微醉 | 园豆:60 (初学一级) | 2012-06-23 16:14
0

RCreateList_L()方法中的字符数组char str[MAXSIZE]是个局部变量,出了函数就被释放了,所有你的指针指向了无效的内存,print出来自然是乱码。

Hao Renjie | 园豆:202 (菜鸟二级) | 2012-06-27 19:51
0

二楼分析是对的,虽然用到malloc 但分配的是两个指针,而指针s所指的内容是局部的且重复使用会覆盖,出了那个函数就被释放了。

upendi | 园豆:204 (菜鸟二级) | 2012-07-13 11:04

void RCreateList_L(LinkList L) //逆序建表

 char *pstr,str[MAXSIZE];
 scanf("%s",&str); 
 pstr =(char*)malloc(strlen(str)+1);
 strcpy(pstr,str);
 while(strcmp(str,"end") != 0) 
 {  
  LinkList p = (LinkList) malloc (sizeof(LNode));  
  if(!p) exit(-1);  
  p->s = pstr;  
  p->next = L->next;  
  L->next = p;  
  scanf("%s",&str); 
  pstr =(char*)malloc(strlen(str)+1);
  strcpy(pstr,str);
 }
}

支持(0) 反对(0) upendi | 园豆:204 (菜鸟二级) | 2012-07-13 11:05
0

看看这个函数的代码吧:

void RCreateList_L(LinkList L) //逆序建表

 char str[MAXSIZE]; 
 scanf("%s",&str);
 while(strcmp(str,"end") != 0) 
 {  
  LinkList p = (LinkList) malloc (sizeof(LNode));  
  if(!p)
   exit(-1);  
  p->s = str;  
  p->next = L->next;  
  L->next = p;  
  scanf("%s",&str); 
 }
}

其中p->s = str;是有问题的,因为str是局部变量,p中的成员s是指针,指针指向数组str,但是这里的str是个局部变量,所以当函数执行完之后自动释放掉了,那么这时链表中的各个节点的成员变量s指针指向的str就都不存在了。所以就出现了你所说的“烫”。

解决方案一:可以把str变为全局的,但是,最好是str[][]即二维数组。这样保证每个节点指向的值都存在。

解决方案二:把LNode中的成员s改成字符数组,省掉指针的麻烦。

祝您好运哈!!!!

VincentPass | 园豆:238 (菜鸟二级) | 2012-07-13 11:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册