首先,这是一个测试程序,我想测试一些具体的东西,看看它是否有效。假设我想将 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/