函数与malloc语法错误?

时间:2015-01-26 19:48:25

标签: c function malloc

我是使用指针的新手,我不知道为什么这不起作用。如果我在scan函数内打印它可以工作,但它必须在一个单独的函数中。

#include <stdio.h>
#include <stdlib.h>
int scan(int n, int *buffer)
{
    int i;
    printf("nr of elements:\n");
    scanf("%d", &n);
    //int *buffer, i=0;
    // *buffer=(int*)malloc((*n) * sizeof(int));
    buffer = malloc((n + 1) * sizeof(*buffer));
    for(i=0; i<n; i++){
         buffer[i]=i+1;
         printf ("%d ", buffer[i]);}
         printf ("\n-------------\n");   
 }

 void print(int *n,int *buffer){
    int i;
    for(i=0; i<n; i++){
       printf ("%d ", buffer[i]);}
 }

 int main()
 {
    int n,i, *buffer;
    scan(&n, &buffer);
    print(n, *buffer);

    printf("i quit\n");
    for(i=0; i<n; i++){
       printf ("%d ", buffer[i]);
    }
    return 0;
}

3 个答案:

答案 0 :(得分:0)

有两种方法可以改变函数的参数(在函数外部更改数据):

1)使用引用(在我的例子中 - 扫描函数的第一个参数)

2)使用指针(在我的例子中 - 扫描的第二个参数......这个论点是类型int *)

试试这个(我的评论显示更改):

&#13;
&#13;
#include <stdio.h>
#include <stdlib.h>
void scan(int &n, int ** buffer) // pointer to pointer for bufer, void instead of int for function, and &int for n
{
    int i;
    printf("nr of elements:\n");
    scanf("%d", &n);
    *buffer = (int*) malloc( n * sizeof(**buffer)); // (int*) should be, and *buffer
    for(i=0; i<n; i++){
         (*buffer)[i]=i+1;   // *buffer
         printf ("%d ", (*buffer)[i]);  // *buffer
	}
    printf ("\n-------------\n");   
 }

 void print(int n, int *buffer)   // type of n changed from int* to int
 {
    int i;
    for(i=0; i<n; i++){
       printf ("%d ", buffer[i]);
	}
 }

 int main()
 {
    int n,i, *buffer = NULL;
    scan(n, &buffer);
    print(n, buffer); // buffer is pointer, no need to use *

    printf("i quit\n");
    for(i=0; i<n; i++){
       printf ("%d ", buffer[i]);
    }
    return 0;
}
&#13;
&#13;
&#13;

注意:如果您想要更改数据,可以使用

&#13;
&#13;
void changeArgument(int * data) 
{
	(*data)++;
}
&#13;
&#13;
&#13;

但要更改数据地址,您应该使用

&#13;
&#13;
void changeArgument(int ** pointer) 
{
	(*pointer) = (int*)malloc(sizeof(int));
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

使用(稍微)更具描述性的变量名称可以帮助充分清楚地表明&#39; n&#39;在扫描中与&#39; n&#39;不同印刷品:

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

void scan(int *np, int **bufferp)
{
    int i;
    printf("nr of elements:\n");
    scanf("%d", np);

    *bufferp = (int*)malloc(*np * sizeof(**bufferp));
    for(i=0; i < *np; i++){
      (*bufferp)[i] = i + 1;
      printf ("%d ", (*bufferp)[i]);
    }
    printf ("\n-------------\n");
 }

 void print(int n, int *buffer){
    int i;
    for(i=0; i<n; i++){
       printf ("%d ", buffer[i]);
    }
    printf("\n");
 }

 int main()
 {
    int n, i, *buffer;
    /* pass references to n and buffer for scan to modify */
    scan(&n, &buffer);
    print(n, buffer);
    return 0;
}

答案 2 :(得分:0)

使用void返回类型声明scan()并显示数据本身。 或者,如果您希望函数返回int,则不是在函数中打印它而是返回值并将其显示在main()中。它应该工作正常。

相关问题