c - C 中传递指针

标签 c pointers

      main()
        {
            char** names = NULL;
            int numStudents = 0;
            AddStudent(&names,"Bob", NumStudents);
            printf("%s", names[0]);
        }

将学生添加到数组的函数

void AddStudent(char*** names, char* name, int numStudents) 
        {
        numStudents++;
        *names = (char**)realloc(*names, sizeof(char*)*numStudents);
        if (*names == NULL) {
            printf("malloc failed\n");
            exit(1);
        }
        char** arr = *names;
        AddStringToArray(arr, name, numStudents);
    }
    void AddStringToArray(char** arr, char* str, int index)
    {
        arr[index-1] = malloc(strlen(str));
        if (arr[index-1] == NULL) {
            printf("malloc failed\n");
            exit(1);
        }
        strcpy(arr[index-1], str);
    }

我尝试了这个并得到了这个评论-

Error reading characters of string

当我尝试在主函数中打印时

最佳答案

这是 AddStringToArray 的简单起点:

  1. 传递一个字符串数组,即一个 char**
  2. 传递添加新 char* 位置的索引。
  3. 确保您传递的索引位于数组范围内,以确保分配足够的空间。

调用代码:

char* names[3];
size_t namesCapacity = 3;
AddStringToArray(names, "Bob", 0, namesCapacity);
AddStringToArray(names, "Sue", 1, namesCapacity);
AddStringToArray(names, "Pete", 2, namesCapacity);

AddStringToArray 定义:

void AddStringToArray(char** arr, char* str, size_t index, size_t arrCapacity) {
    if (index >= namesCapacity) 
        printf("Error, out of bounds\n");
        exit(1);
    }
    arr[index] = malloc(strlen(str));
    if (arr[index] == NULL) {
        printf("malloc failed\n");
        exit(1);
    }
    strcpy(arr[index], str);
}
<小时/>

回复评论:

如果您无法跟踪数组的大小,我们可以创建另一个函数来在必要时重新分配。

void AddOrUpdate(char*** arrPtr, char* str, size_t index)
{
    *arrPtr = realloc(*arrPtr, index+1);
    if(*arrPtr == NULL) {
        printf("malloc failed\n");
        exit(1);
    }
    char** arr = *arrPtr;
    AddStringToArray(arr, str, index, index+1);
}

然后这样调用它:

char** names = NULL;
AddOrUpdate(&names, "Bob", 0);
AddOrUpdate(&names, "Sue", 1);
AddOrUpdate(&names, "Pete", 2);

注意:确保始终添加到数组的末尾。如果您添加到中间,此实现将重新分配到该点,并且您将丢失该索引之后的所有内容。

此外,如果您只想将字符串添加到数组末尾,则必须在数组范围内使用终止 NULL。然后,当您想要添加某些内容时,从数组的开头对其进行迭代,并将其作为索引传递给 AddOrUpdate

关于c - C 中传递指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34253507/

相关文章:

c - 披萨代码不起作用 | Cinnamon 上的 C 编程

C# - perlembed - 在 linux 中编译错误

c++ - 我如何将多维数组作为指针传递给c

c++ - 将字符串作为指针传递时出错,无法将 const char* 分配给 char*

c - 为什么这个链表初始化不起作用?

c - Apache HTTPD 中的内置全局存储

c++ - 是依靠GCC/LLVM的 `-fexceptions`技术上未定义的行为吗?

c - 变量值意外改变?

c - C 中的数组数组

C++ - 使指向父类(super class)的指针与函数中的子类参数匹配