将指针(包含指针的数组)的指针复制到另一个指针

时间:2018-03-22 18:18:35

标签: c

我试图将指针复制到指针(包含指针的数组)但是当我运行它时得到奇怪的结果: 这是我的代码:

#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中的一个例子时,我遇到了这个问题。

2 个答案:

答案 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)”。