C初学者 - 将char *数组复制到另一个char *数组

时间:2014-01-22 17:49:58

标签: c

我一直在挣扎这个愚蠢的时间。 基本上,我需要将一个char指针数组复制到另一个char指针数组。

现在,我有这个功能:

void copyArray(char *source[], char *destination[]) {
    int i = 0;

    do {
        destination[i] = malloc(strlen(source[i]));
        memcpy(destination[i], source[i], strlen(source[i]));
    } while(source[i++] != NULL);
}

这会导致分段错误。有人可以帮忙吗?

谢谢!

编辑:示例程序

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

// Copy the contents of one array into another
void copyArray(char *source[], char *destination[]){
    // printf("In copy array");
    int i = 0;

    do {
        destination[i] = malloc(strlen(source[i]));
        memcpy(destination[i], source[i], strlen(source[i]));
    } while(source[i++] != NULL);
}

void addToHistory(char *history[][40], char *args[]){
    int i;
    for(i = 1; i < 10; i++){
        copyArray(history[i], history[i-1]);
    }
    i = 0;
    copyArray(args, history[0]);
}

int main(void){
    char *history[10][40];
    char *args[40];

    history[0][0] = NULL;

    args[0] = "ls";
    args[1] = NULL;

    addToHistory(history, args);
}

3 个答案:

答案 0 :(得分:1)

  1. 确保source数组中的最后一个元素为NULL,然后再将其传递给copyArray

  2. copyArray中,添加while代替do,仅增加i 在结尾

  3. 相反以上所有内容,您只需在功能i++中将++i更改为copyArray

    但如果传递给此函数的source数组中的第一个元素为NULL,它将会崩溃。

答案 1 :(得分:0)

我认为你有一个错误的错误:

do {
    destination[i] = malloc(strlen(source[i]));
    memcpy(destination[i], source[i], strlen(source[i]));
} while(source[i++] != NULL);
               ^^^

你在之后检查我是否 NULL ,然后结束循环。尝试用

替换它
} while (source[++i] != NULL);           // or while (source[++i]), for short

您可以尝试在每次迭代后记录一条短消息,以查看代码出错的位置。

修改:您是否有理由使用memcpy()(不会复制终止'\0')而不是strcpy()(将会)?

(注意@wildplasser:我相信strdup()可能不是标准C)。

答案 2 :(得分:0)

void copyArray(char *source[], char *destination[]) {

    while ((*destiantion = *source)) {
        *destination++ = strdup( *source++ );
    }
}

BTW:将目的地作为第一个参数是常见的,就像在strcpy()

中一样
void copyArray(char *destination[], char *source[]) { ... }