引用 int malloc 指针
deferencing the int malloc pointer
int main()
{
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int rslt, n;
float sum = 0;
scanf("%d", &n);
int *tri = (int*)malloc(n * 3 * sizeof(int));
if(tri == NULL){
return 1;
}
printf("%d\n", *(tri[0]));
当我引用三指针时,它显示错误。
一元“*”的无效类型参数。
感谢你的回答。
以上部分已澄清,但我还有另一个问题。但我还有一个问题
int main()
{
int rslt, n;
float sum = 0;
scanf("%d", &n);
int *tri = (int*)malloc(n * 3 * sizeof(int));
if(tri == NULL){
return 1;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%d", &(tri[j]));
}
printf("\n");
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
sum += tri[j] / 2;
printf("%d %d\n",sum,tri[j] / 2);
}
}
printf("%d\n",sum);
return 0;
}
当我打印 tri[j] 时,它显示了一些垃圾值。
由于此声明
,变量 tri
的类型为 int *
int *tri = (int*)malloc(n * 3 * sizeof(int));
注意你分配了一个未初始化的内存。
表达式 tri[0]
的类型为 int
。并且您正在尝试将取消引用运算符应用于 int
类型的表达式
*(tri[0])
所以编译器报错。
你可以这样写
int *tri = (int*)calloc(1, n * 3 * sizeof(int));
然后写成
printf("%d\n", tri[0]);
或
printf("%d\n", *tri);
这些for循环
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%d", &(tri[j]));
}
printf("\n");
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
sum += tri[j] / 2;
printf("%d %d\n",sum, tri[j] / 2);
}
}
printf("%d\n",sum);
不正确。使用了不正确的转换说明符 %d
而不是 %f
和变量 sum
以及不正确的索引表达式。你需要写
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%d", &(tri[3 * i + j]));
}
printf("\n");
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
sum += tri[3 * i + j] / 2;
printf("%f %d\n",sum, tri[3 * i + j] / 2);
}
}
printf("%f\n",sum);
数组表达式 a[i]
定义为 *(a + i)
- 给定一些地址值 a
,偏移量 i
个元素( 不是字节!) 从那个地址解引用结果,所以
*tri == *(tri + 0) == tri[0]
表达式 tri[0]
的类型为 int
,这就是编译器在您编写 *(tri[0])
时报错的原因;一元 *
运算符的操作数必须具有指针类型。
因此,在您的 printf
语句中,您将使用 *tri
或 tri[0]
。任一表达式的类型都是 int
.
正如其他人所说,malloc
不会初始化分配的内存,因此 tri[0]
的值可能是任何值。您可以改用 calloc
,它将内存初始化为全零:
int *tri = calloc( n, sizeof *tri );
在 C 中,您不需要转换 malloc
、calloc
和 realloc
1 的结果,我们大多数人会建议你不要这样做。同样,由于表达式*tri
的类型是int
,所以sizeof *tri
的结果与sizeof (int)
相同。这样您就不必担心在声明、强制转换和 sizeof
表达式之间保持类型正确,因此您不太可能犯错。
- 在 C++ 中不是这种情况,但是如果您正在编写 C++,则无论如何都不应该使用 C
*alloc
函数。
int main()
{
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int rslt, n;
float sum = 0;
scanf("%d", &n);
int *tri = (int*)malloc(n * 3 * sizeof(int));
if(tri == NULL){
return 1;
}
printf("%d\n", *(tri[0]));
当我引用三指针时,它显示错误。 一元“*”的无效类型参数。 感谢你的回答。 以上部分已澄清,但我还有另一个问题。但我还有一个问题
int main()
{
int rslt, n;
float sum = 0;
scanf("%d", &n);
int *tri = (int*)malloc(n * 3 * sizeof(int));
if(tri == NULL){
return 1;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%d", &(tri[j]));
}
printf("\n");
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
sum += tri[j] / 2;
printf("%d %d\n",sum,tri[j] / 2);
}
}
printf("%d\n",sum);
return 0;
}
当我打印 tri[j] 时,它显示了一些垃圾值。
由于此声明
,变量tri
的类型为 int *
int *tri = (int*)malloc(n * 3 * sizeof(int));
注意你分配了一个未初始化的内存。
表达式 tri[0]
的类型为 int
。并且您正在尝试将取消引用运算符应用于 int
*(tri[0])
所以编译器报错。
你可以这样写
int *tri = (int*)calloc(1, n * 3 * sizeof(int));
然后写成
printf("%d\n", tri[0]);
或
printf("%d\n", *tri);
这些for循环
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%d", &(tri[j]));
}
printf("\n");
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
sum += tri[j] / 2;
printf("%d %d\n",sum, tri[j] / 2);
}
}
printf("%d\n",sum);
不正确。使用了不正确的转换说明符 %d
而不是 %f
和变量 sum
以及不正确的索引表达式。你需要写
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%d", &(tri[3 * i + j]));
}
printf("\n");
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
sum += tri[3 * i + j] / 2;
printf("%f %d\n",sum, tri[3 * i + j] / 2);
}
}
printf("%f\n",sum);
数组表达式 a[i]
定义为 *(a + i)
- 给定一些地址值 a
,偏移量 i
个元素( 不是字节!) 从那个地址解引用结果,所以
*tri == *(tri + 0) == tri[0]
表达式 tri[0]
的类型为 int
,这就是编译器在您编写 *(tri[0])
时报错的原因;一元 *
运算符的操作数必须具有指针类型。
因此,在您的 printf
语句中,您将使用 *tri
或 tri[0]
。任一表达式的类型都是 int
.
正如其他人所说,malloc
不会初始化分配的内存,因此 tri[0]
的值可能是任何值。您可以改用 calloc
,它将内存初始化为全零:
int *tri = calloc( n, sizeof *tri );
在 C 中,您不需要转换 malloc
、calloc
和 realloc
1 的结果,我们大多数人会建议你不要这样做。同样,由于表达式*tri
的类型是int
,所以sizeof *tri
的结果与sizeof (int)
相同。这样您就不必担心在声明、强制转换和 sizeof
表达式之间保持类型正确,因此您不太可能犯错。
- 在 C++ 中不是这种情况,但是如果您正在编写 C++,则无论如何都不应该使用 C
*alloc
函数。