请修复此程序。
int *arr[2]={10,20};
arr[1]=arr;
*arr[1]=30;
printf("%d",arr);
我无法在arr [0]中插入30,arr [1]指向& arr然后我将30插入arr [0]。
答案 0 :(得分:2)
你这里有一个严重的错误
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};
然后
arr[2] = 30;
会将30
存储在数组中的第3个位置,如果您事先不知道大小,那么您需要使用malloc()
,首先要向{int
声明一个poitner 1}}
int *arr;
现在你把它指向像这样的有效记忆
arr = malloc(2 * sizeof(int));
以上您刚刚请求了足够的空间来存储2
int
并使用arr
指针指向它,现在您必须检查指针是否确实指向有效内存,如果出现问题且malloc()
无法为您提供有效内存的地址,则返回特殊值NULL
,因此您检查
if (arr == NULL)
pleaseAbortUsing_arr_ItsInvalid();
在上面的代码中你需要尽可能地处理这个问题,你可以清理其他资源并返回NULL
如果你在一个函数中,有时它甚至需要终止程序,但是这取决于。
现在您的指针指向有效内存,您可以将值存储到该内存中,通常的数组下标符号可以完美地运行,所以只需
arr[0] = 10;
arr[1] = 20;
但是你又不能添加第三个数字,因为没有足够的空间,在这种情况下你可以使用realloc()
,这个函数会增加指向块的大小或指向a新的,如有必要,复制旧的内容,所以要使用它,你这样做
void *pointer;
pointer = realloc(arr, 3 * sizeof(int));
if (pointer == NULL)
{
free(arr);
pleaseAbortUsing_arr_ItsInvalid();
}
arr = poitner;
arr[2] = 30;
再次尽可能地处理错误,最后当您使用arr
完成后,就像这样打电话给free()
free(arr);
如果arr
将从您调用free
的函数返回,当调用者完成使用它时,实际上您可以随时调用,同时数据将是有效的,对于如果你需要它的整个生命周期。
答案 1 :(得分:-1)
int arr[3] = {10,20, 0};
arr[2] = 30;
printf("%d, %d, %d\n",arr[0], arr[1], arr[2]);
您应该查找C语法,因为到目前为止您所做的任何事情都没有任何意义。