基本指针C编程

时间:2014-08-27 04:47:06

标签: c pointers

嘿,我只是在参数1大于参数2时才试图切换两个参数。

到目前为止我得到的是:

#include <stdio.h>

void ascending2(int*, int*);

int main(void){
    int ptr1 = 20;
    int ptr2 = 10;
    printf("ptr1 = %d, ptr2 = %d", ascending2(&ptr1, &ptr2));
    return 0;
}

void ascending2(int *ptr1, int* ptr2){
    int *value; 
    if( *ptr1 >= *ptr2 ){
         *value = *ptr1;
         *ptr1 = *ptr2;
         *ptr2 = *value;}
}

任何人都可以建议我可能出错的地方,谢谢。

5 个答案:

答案 0 :(得分:4)

这是因为在ascending2函数中,您将value声明为指针,但实际上并不是指向任何地方。因此,当您取消引用它时,您将取消引用未初始化的指针,该指针将导致undefined behavior

有两个明显的解决方案:要么使value指向某个地方有效,要么更好地将其声明为非指针变量。


您的printf来电也存在问题,因为ascending2被宣布退回void,换句话说,它根本不会返回任何内容,但您还要打印两个值。这也会导致未定义的行为。

此处的解决方案是单独调用该函数,然后使用printfptr1变量调用ptr2(顺便说一下,这些变量名称不是很好,因为它们不是实际指针)。

答案 1 :(得分:2)

printf("ptr1 = %d, ptr2 = %d", ascending2(&ptr1, &ptr2));

这里ascending2(..)没有返回任何内容。 需要更改printf。像

 ascending2(&ptr1, &ptr2);
 printf("ptr1 = %d, ptr2 = %d",ptr1,ptr2);

你的功能应该是

void ascending2(int *ptr1, int* ptr2){
    int value;                     // change *value to value
    if( *ptr1 >= *ptr2 ){
         value = *ptr1;            // change *value to value
         *ptr1 = *ptr2;
         *ptr2 = value;}           // change *value to value
}

答案 2 :(得分:1)

您声明的value是一个指针。将其更改为int value

答案 3 :(得分:1)

在这里,错误得到纠正。

#include <stdio.h>

void ascending2(int*, int*);

int main(void){
    int ptr1 = 20;
    int ptr2 = 10;
    ascending2(&ptr1, &ptr2); //Fix1

    printf("ptr1 = %d, ptr2 = %d", ptr1, ptr2);
    return 0;
}

void ascending2(int *ptr1, int* ptr2){
    int value=0; //Fix2
    if( *ptr1 >= *ptr2 ){
         value = *ptr1;
         *ptr1 = *ptr2;
         *ptr2 = value;}
}

Fix1: 参数不应该像你那样传递给printf语句。函数ascending2也不会返回任何值。所以调用ascending2 API 1st然后打印ptr1,ptr2的值。要了解有关printf的更多信息,请参阅以下链接。 http://www.cplusplus.com/reference/cstdio/printf/

FIX2:

在ascending2函数内部,不需要使用value作为指针变量。它可以只是整数。如果使用value作为指针,则应提供适当的内存。

答案 4 :(得分:0)

只是添加一些建议,已经有了很好的答案:可以改进交换功能:

void ascending2(int *ptr1, int* ptr2)
{
  if( *ptr1 > *ptr2 )
  {
    const int tmp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = tmp;
  }
}

改进:

  • 使用>进行比较,如果两个值相等则无需执行任何操作,因此使用>=进行比较是没有意义的。
  • 将临时变量移动到使用它的范围内。
  • 将其重命名为tmp,使其更加清晰。 &#34;值&#34;非常通用。
  • 制作const,因为它在分配后不会发生变化。
  • 直接使用所需的值初始化。