C 指针数组中的插入

C 指针数组中的插入,c,arrays,pointers,C,Arrays,Pointers,请修复这个程序 int *arr[2]={10,20}; arr[1]=arr; *arr[1]=30; printf("%d",arr); 我无法将30插入arr[0],arr[1]指向&arr,然后我将30插入arr[0] int arr[3] = {10,20, 0}; arr[2] = 30; printf("%d, %d, %d\n",arr[0], arr[1], arr[2]); 您可能应该查找C语法,因为到目前为止您所做的一切都没有意义。您在这里遇到了一个严重错误

请修复这个程序

int *arr[2]={10,20};

arr[1]=arr;

*arr[1]=30;

printf("%d",arr);
我无法将30插入arr[0],arr[1]指向&arr,然后我将30插入arr[0]

int arr[3] = {10,20, 0};

arr[2] = 30;

printf("%d, %d, %d\n",arr[0], arr[1], arr[2]);

您可能应该查找C语法,因为到目前为止您所做的一切都没有意义。

您在这里遇到了一个严重错误

int *arr[2]={10,20};
您没有声明一个整数数组,它是一个int指针数组,以这种方式初始化它是不正确的

正确的做法是删除*,这样看起来

int arr[2] = {10, 20};
您不能简单地用

arr[2] = 30;
由于只分配了两个元素的空间,因此您无权访问arr[2]中的任何内容,因此您无法分配给它,如果您事先知道数组的长度,则可以这样做

int arr[KNOWN_LENGTH_WHICH_IS_GREATER_THAN_TWO] = {10, 20};
然后

将在数组的第3个位置存储30,如果您事先不知道大小,则需要使用malloc,首先将poitner声明为int

现在您可以像这样指向有效内存

arr = malloc(2 * sizeof(int));
free(arr);
在上面,您刚刚请求了足够的空间来存储2个int并用arr指针指向它,现在您必须检查指针是否确实指向有效内存,如果出现问题并且malloc无法为您提供有效内存的地址,那么它将返回一个特殊值NULL,因此您需要检查

if (arr == NULL)
    pleaseAbortUsing_arr_ItsInvalid();
在上面的代码中,您需要尽可能地处理这个问题,如果您在函数中,您可以清理其他资源并返回NULL,有时甚至需要终止程序,但这取决于具体情况

既然指针指向有效内存,您就可以将值存储到该内存中,那么通常的数组下标表示法就可以很好地工作了

arr[0] = 10;
arr[1] = 20;
但是,由于没有足够的空间,您不能再添加第三个数字,在这种情况下,您可以使用realloc,此函数将增加指向块的大小或指向新块,并在必要时复制旧块的内容,因此要使用它,您可以这样做

void *pointer;

pointer = realloc(arr, 3 * sizeof(int));
if (pointer == NULL)
 {
     free(arr);
     pleaseAbortUsing_arr_ItsInvalid();
 }
arr    = poitner; 
arr[2] = 30;
再次尽可能地处理错误,最后当您使用arr完成时,您可以像这样免费调用它

arr = malloc(2 * sizeof(int));
free(arr);

如果在调用者使用完某个函数后,您可以免费调用该函数返回arr,事实上,只要您愿意,您可以随时免费调用,同时,如果您需要,数据将在整个程序生命周期内有效。

C不允许您发明自己的语义。具体地说,arr[1]=arr;并不意味着将arr扩展一个元素。事实上,C完全没有这种语义的操作。这看起来很随机。int*arr[2]定义了一个由两个指向整数的指针组成的数组。但是它被初始化为10和20,它们不是有效的指针。请求“请修复此程序”假设观众知道该程序到底应该做什么,而不是它做什么,目前还不清楚。您不能扩展以这种方式声明的数组:您只能扩展动态分配的数组,使用malloc或calloc,使用realloc.C并不能让您发明自己的语义,但我想!定义整数*