通过引用传递数组到C中的函数

时间:2012-01-24 12:33:02

标签: c arrays xcode macos

我真的很难让这段代码工作。我试图通过引用函数传递数组,以便在该函数中修改它。然后我需要将修改交还给原来的调用函数。

我在这里搜索过类似的问题,但找不到任何可以像我想要的那样成功运行的东西。

这是我的代码,我真的很感激任何帮助。非常感谢:

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

#define SIZE_OF_VALUES 5
#define SIZE_OF_STRING 100

void set_values(char **values);

void set_values(char **values)
{
    *values = malloc(sizeof(char)*SIZE_OF_VALUES);
    for (int i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) {
        values[i] = malloc(sizeof(char)*SIZE_OF_STRING);
        values[i] = "Hello";
        //puts(values[i]); //It works fine here.
    }
}

int main (int argc, const char * argv[])
{
    char *values;
    set_values(&values);

    for (int i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) {
        puts(values[i]); //It does not work!
    }

    return 0;
}

5 个答案:

答案 0 :(得分:3)

您的代码存在一些问题:

  1. 您应该有三个级别的指针 - void set_values(char ***values),将其作为“*的参考(第一个*)读取{{1 (第三个char*)“

  2. *中的每个元素都应该是指针(*values)而不是char*,因此您需要:

    char
  3. 您正在泄漏内存,首先进行mallocing然后分配文字,另外不要取消引用*values = malloc(sizeof(char*)*SIZE_OF_VALUES); ,您需要:

    values

    (*values)[i] = "Hello";
    

    (*values)[i] = strdup("Hello");  // you will have to free it later
    
  4. (*values)[i] = malloc(sizeof(char)*SIZE_OF_STRING); // you will have to free this as well strcpy((*values)[i], "Hello"); 中,您应该声明main,因为它是指向char **values;数组的指针(字符串/数组)。

  5. 在循环中,您错误地将索引乘以char*,索引在元素中计算,而不是以字节为单位。因此,您需要:

    sizeof
  6. 最后不要忘记释放记忆。

答案 1 :(得分:0)

使用char ***类型作为set_values功能的参数:

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

#define SIZE_OF_VALUES 5

void set_values(char ***values)
{
    *values = malloc(sizeof (char *) * SIZE_OF_VALUES);
    for (int i = 0; i < SIZE_OF_VALUES; i++) {
        (*values)[i] = "Hello";
    }
}

int main (int argc, char *argv[])
{
    char **values;
    set_values(&values);

    for (int i = 0; i < SIZE_OF_VALUES; i++) {
        puts(values[i]);
    }

    return 0;
}

当然,您必须在退出main之前检查malloc返回值和free分配的内存。

答案 2 :(得分:0)

char *是char的一维数组。但是您希望set_values中的代码将值设置为二维数组。 为了使这项工作,定义:

值为char **values;

set_values为void set_values(char ***values)

为char数组分配指针: *values = malloc(sizeof(char*)*SIZE_OF_VALUES);

除了你的循环有点奇怪:

for (int i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) {

应替换为

for (int i = 0; i < SIZE_OF_VALUES; i++) {

最后,如果要将字符串复制到现在分配的数组中,请使用

strncpy((*values)[i], "Hello",  SIZE_OF_STRING-1);
(*values)[i][SIZE_OF_STRING-1] = '\0';

总的来说:

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


#define SIZE_OF_VALUES 5
#define SIZE_OF_STRING 100

void set_values(char ***values);

void set_values(char ***values)
{
    const char * content = "Hello";
    *values = malloc(sizeof(char*)*SIZE_OF_VALUES);
    for (int i = 0; i < SIZE_OF_VALUES; i++) {
        (*values)[i] = malloc(sizeof(char)*SIZE_OF_STRING);
        strncpy((*values)[i], content, SIZE_OF_STRING-1);
        (*values)[i][SIZE_OF_STRING-1] = '\0';
        if(strlen(content) >= SIZE_OF_STRING){
            fprintf(stderr,"Warning content string did not fit into buffer!\n");
        }
    }
}

int main (int argc, const char * argv[])
{
    char **values;
    set_values(&values);

    for (int i = 0; i < SIZE_OF_VALUES; i++) {
        printf("%s\n", values[i]);
    }

    for (int i = 0; i < SIZE_OF_VALUES; i++) {
       free(values[i]);
    }
    free(values);

    return 0;
}

答案 3 :(得分:0)

这是解决方案。

void set_values(char ***values)
{
    int i;
    char ** val;

    val = *values = (char**)malloc(sizeof(char*)*SIZE_OF_VALUES);
    for (i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) 
        val[i] = "Hello";
}

int main (int argc, const char * argv[])
{
    char **values;
    int i;
    set_values(&values);

    for (i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) 
        puts(values[i]); 

    return 0;
}

答案 4 :(得分:-3)

此行中还有一个*

*values = malloc(sizeof(char)*SIZE_OF_VALUES);

应该是:

values = malloc(sizeof(char)*SIZE_OF_VALUES);

此外,您的主要内容存在相当大的问题,char* values应为char** values,通过引用(char* values)传递set_values(&values);可能会导致我怀疑的分段错误。

为了影响外部数组,它已经受到影响,因为当传递给函数时,您只复制指向同一位置的指针,因此修改将影响相同的内存块。