将一个字符串复制或分配给二维指针数组中的另一个字符串

标签 c arrays string char variable-assignment

首先,这是一个测试程序,我想测试一些具体的东西,看看它是否有效。假设我想将 x 分配给 arr[0][4] 并希望保留此更改,以便 arr[0][4] 也是主函数中的 x:

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

void changE(char *arr[10][5]);

int main(void){
    char *arr[10][5];
    arr[0][0] = "Johny";
    arr[0][1] = "Tony";
    arr[0][2] = "Tiki";
    arr[0][3] = "Kitty";
    arr[0][4] = "Douglas";
    arr[1][0] = "Piki";
    arr[1][1] = "Kati";
    arr[1][2] = "Sathi";
    arr[1][3] = "Dony";
    changE(arr);
    int i = 0;
    int j;
    for(i;i<=1;i++){
        for(j=0;j<=4;j++){
            printf("%s\n", arr[i][j]);
        }
        printf("\n\n\n");
    }
    return 0;
}
void changE(char *arr[10][5]){
    char x[50] = "Tinky";
    arr[0][4] = x;
}

问题是我无法将 x 分配给 arr[0][4],程序刚刚关闭。我也试过 strcpy,这个:

void changE(char *arr[10][5]){

    char x[50] = "Tinky";
    strcpy(arr[0][4], x);
}

程序刚刚关闭的 strcpy 也是一样的。 我只能这样做:

void changE(char *arr[10][5]){
    arr[0][4] = "Tinky";
}

考虑到 x 是一个我不知道的字符串(或来自 scanf 的字符串),这对我一点帮助都没有。 因此,如果 x 来自 scanf,我如何将 x 分配给 arr[0][4]?任何帮助,将不胜感激!谢谢:)

最佳答案

这个方法

void changE(char *arr[10][5]){
    char x[50] = "Tinky";
    arr[0][4] = x;
}

不起作用,因为您正在分配一个具有自动存储(又名“本地”)持续时间的变量。一旦函数返回,它就不再存在了。这是未定义的行为

这个方法

void changE(char *arr[10][5]){

    char x[50] = "Tinky";
    strcpy(arr[0][4], x);
}

不起作用,因为 arr[0][4] 指向字符串文字。您不能修改字符串文字。同样,这是未定义的行为

这个方法

void changE(char *arr[10][5]){
    arr[0][4] = "Tinky";
}

如果您只有指针并且没有为这些指针的指针分配任何内存,那么这是唯一正确的方法。

So if x comes from a scanf how can i assign x to arr[0][4]?

对于这种情况,您需要分配内存并将其分配给arr[0][4]

void changE(char *arr[10][5]){ 
   char x[40] = "Tinky";
   arr[0][4] = strdup(x); //POSIX, equivalent std C would be malloc()+strcpy()
}

虽然这很乱。该数组具有指向字符串文字的指针。但是只是 arr[0][4] 指向一个 malloc 的内存。如果您希望能够修改它或稍后调用 free() 时,您需要跟踪此类指针 在上面。

如果您希望能够修改它们,我建议您只使用数组而不是指针数组,因为很难跟踪各种已分配的指针和其余指针在字符串文字处。

关于将一个字符串复制或分配给二维指针数组中的另一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34571182/

相关文章:

C循环: printing India Map

c - POINTER_SIGNED 或 POINTER_UNSIGNED 的用例?

python - 除保留的子字符串外,对每个字符进行拆分

python - 从 ArDrone 2.0 获取图像,并使用 cv2

string - 如何检查golang模板中字符串的空值

c - 为什么 C 没有成为独立于平台的语言?

c - 大整数运算

python - 使用自己的内容将 numpy 数组扩展到特定范围

c - 如何读取数组中int的随机数

arrays - 将jSON阵列导入Hive/Hadoop