问题描述
我已经定义了一个表示字符串的结构,并希望从该字符串结构中列出一个列表。我已经编写了一个toString函数,该函数获取一个char指针,结果是这样的字符串结构。我已经编写了一个函数toList,该函数获取char指针的指针,从这些char指针生成字符串,并将它们连接到字符串列表。
现在,我想使用它们,但是我总是会遇到此堆栈错误0 [main] stringL 1123 cygwin_exception::open_stackdumpfile: Dumping stack trace to stringL.exe.stackdump
。问题可能是与makro进行分配吗?甚至没有输出调试输出0、1、2、3。感谢您的帮助。
代码:
#include<stdio.h>
#include<stdlib.h>
#define EMPTYLIST NULL
#define ISEMPTY(l) ((l) == EMPTYLIST)
#define TAIL(l) ((l)->next)
#define HEAD(l) ((l)->str)
typedef struct {
char *str;
unsigned int len;
} String;
typedef struct ListNode *StringList;
struct ListNode {
String str;
StringList next;
};
String toString (char *cstr) {
String res = {NULL,0};
res.str = malloc(sizeof(char));
char *ptr = res.str;
while(*cstr) {
*ptr++ = *cstr++;
res.str = realloc(res.str,sizeof(char) * (res.len +2));
res.len++;
}
*ptr = '\0';
return res;
}
StringList toList (char **cstrs,unsigned int sc){
if(sc > 0) {
StringList res = malloc(sizeof(*res));
HEAD(res) = toString(*cstrs);
TAIL(res) = toList(cstrs+1,sc+1);
}
return EMPTYLIST;
}
int main() {
printf("0");
char **strs = malloc(sizeof(**strs) *2);
unsigned int i = 0;
char *fst = "Der erste Text";
char *snd = "Der zweite Text";
printf("1");
StringList res = toList(strs,2);
StringList lstPtr = res;
strs[0] = malloc(sizeof(char) * 15);
strs[1] = malloc(sizeof(char) * 16);
printf("2");
while(*fst) {
strs[0][i] = *fst++;
i++;
}
printf("3");
i = 0;
while(*snd) {
strs[1][i] = *snd++;
i++;
}
printf("Liste: \n");
for(i = 0; i < 2; i++){
printf("Text %d: %s\n",i,HEAD(lstPtr++));
}
return 0;
}
解决方法
此声明之后
res.str = realloc(res.str,sizeof(char) * (res.len +2));
可以更改指针res.str
中存储的值。结果,指针ptr
递增后存储在值中
*ptr++ = *cstr++;
可能无效,并且不指向重新分配的内存中的位置。