如何解决指针错误?

时间:2015-08-11 17:19:20

标签: c pointers

我是指针的新手。 对于以下程序,我得到255而不是20的答案。请建议如何纠正。

以下是代码:

int sum(int *a ,  int *b);
int main()
{
    int *p;
    int *q;
    *p =10;
    *q =10;
    int c = sum(p,q);
    printf("%d",c);
}
int sum(int *a , int *b)
{  
    return((*a)+ (*b));
}

6 个答案:

答案 0 :(得分:3)

有数据,然后有指针。为简单起见,一旦有了数据,就可以指向它。这是通过使用&运算符完成的。要返回指针中的数据,请使用*运算符

更像是

int sum(int *a ,  int *b);
int main()
{
    int p_data=10;
    int q_data=10;
    int *p =&p_data;
    int *q =&q_data;
    int c = sum(p,q);
    printf("%d",c);
}
int sum(int *a , int *b)
{    
    return((*a)+ (*b));
}

编辑:另请注意,指针可用于访问从mallocmmap'd或其他方式分配的内存

答案 1 :(得分:3)

您需要为指针分配内存。这段代码应该有效:

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

int sum(int *a ,  int *b);
int main()
{
    int *p = (int*) malloc(sizeof(int));
    int *q = (int*) malloc(sizeof(int));
    if (p != NULL && q != NULL)
    {
        *p =10;
        *q =10;
        int c = sum(p,q);
        printf("%d", c);
        free(p);
        free(q);
    }
    else
    {
         printf("Could not allocate enough memory");
         return 1;
    }

    return 0;
}

int sum(int *a , int *b)
{
    return (*a) + (*b);
}

希望这有帮助!

答案 2 :(得分:0)

指针是一个保存另一个变量地址的变量,这对你来说似乎很清楚。但似乎还不是很清楚的是,当你创建一个指针时,编译器也不会自动创建一个指向...的变量。

在代码中:

int *p;
int *q;
*p =10;
*q =10;

您将pq定义为指向int的指针,但指向哪些类型int的变量?他们内部有垃圾,可以指向任何地方,所以当他们指出10点时,实际上,你在内存中的垃圾邮件

在这些条件下,当你调用sum时,我会期望更多的内存错误而不是奇怪的值(255),但是一切都可能发生错误的指针,甚至访问现有的内存。

正确的代码是:

int sum(int *a ,  int *b);

int main()
{
    int i1, i2;      //Allocate 2 int variables
    int *p = &i1;    //Create pointers and assign them
    int *q = &i2;    //the address of int vars i1 and i2
    *p =10;          //Initialize variables pointed by pointers with 10
    *q =10;
    int c = sum(p,q);
    printf("%d",c);
}

int sum(int *a , int *b)
{
    return((*a)+ (*b));
}

答案 3 :(得分:0)

另一种方法。我认为它对返回函数可能没用,但它可以帮助你指点它是passing pointer to the sum function

#include <stdio.h>

int sum(int *a ,  int *b);
int main()
{
    int p = 10;
    int q = 10;

    int c = sum(&p,&q);
    printf("%d",c);
}
int sum(int *a , int *b)
{

    return((*a)+ (*b));
}

答案 4 :(得分:0)

指针需要指定一些有效内存的地址,指向它之前可以取消引用* - 运算符,并将一些数据写入指向的位置。

你错过了那些作业。

取消引用指针意味着读出其值。如果没有为指针变量赋值,那么已经读出它的值可能会调用臭名昭着的未定义行为,之后就会发生任何事情。

所以你的结果也可能只是着名的42

获得的经验:永远不要将任何操作符应用于尚未正确初始化的变量。

答案 5 :(得分:-2)

你得到255是因为随机运气。当我编译它时我得到20,但这也是随机的运气。技术术语是&#34;未定义的行为&#34; ,这是未定义的,因为您从未初始化int *pint *q指针。

你的指针变量里面有什么?你不知道,我不知道,没有人知道。由于您从未初始化它们,因此它们的内容是初始化之前的任何位。这就像搬进一所房子,得到以前的租户留给你的任何垃圾。

如果指针的内容是内存中的地址(并且它们不重叠),则返回的值应为20(随机运气)。但是,如果其中一个包含空地址,谁知道你会得到什么!

如果你想要可靠地获得20,你需要分配内存:

在C ++中:

int * p = new int;
int * q = new int;

在C:

int * p = (int*)malloc(sizeof(int))
int * q = (int*)malloc(sizeof(int))