我试图将指针复制到指针(包含指针的数组)但是当我运行它时得到奇怪的结果: 这是我的代码:
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
void mycopy(char *c[], char *o[], int olen);
char *alloc(int n);
int main() {
char *o[] = { "12", "13", "14" };
char *c[3];
mycopy(c, o, 3);
for (int i = 0; i < 3; i++) {
printf("%s\n", o[i]);
printf("%s\n", c[i]);
}
return 0;
}
void mycopy(char *c[], char *o[], int olen) {
char *t;
for (int i = 0; i < olen; i++) {
//printf("%d\n", strlen(o[i]));
if ((t = alloc(strlen(o[i]))) == NULL) {
printf("don't use copy cause there isn't enough space\n");
return;
}
//printf("%s\n", o[i]);
strcpy(t, o[i]);
//printf("%s\n", t);
*c++ = t;
}
}
#define MAXBUF 1000000
char buf[MAXBUF]; /* Maximum space which we can allocate */
char *bufc = buf;
/* alloc: allocate space to a pointer */
char *alloc(int n) {
if (buf + MAXBUF - bufc >= n) {
bufc += n;
return bufc - n;
}
else
return 0;
}
奇怪的是c的结果是:
121314 1314 14
我在mycopy函数中通过注释的printfs检查过程,并且每件事情都是正确的。
还有其他方式复制?
哦,我是c的初学者,所以当我试图解决K&amp; R2中的一个例子时,我遇到了这个问题。
答案 0 :(得分:0)
t = alloc(strlen(o[i]))
但是字符串的长度是strlen+1
,因为你需要一个字节用于尾随的nul终结符。
如果您不确定,请改用strdup
。
NB。通过检查存储在每个三个指针中的地址,您可以准确地看到为什么这会给它输出它的输出。要么使用调试器,要么只打印地址。
答案 1 :(得分:0)
每个元素的格式为:'1''2''\ 0'(最后一个是终结符)。
最后的缓冲区包含:['1','2','1','3','1','4','\ 0',.......... ]当你打印时,你实际上是从当前元素的开头打印到第一个'\ 0'。每次覆盖最后一个'\ 0'(printf停在那里)。你应该“分配(strlen(o [i] + 1)”。