【问题标题】:Initialize array of strings初始化字符串数组
【发布时间】:2014-01-09 14:56:18
【问题描述】:

初始化 char** 的正确方法是什么? 我收到覆盖错误 - 尝试时读取未初始化的指针 (UNINIT):

char **values = NULL;

char **values = { NULL };

【问题讨论】:

  • 可以将它们初始化为完全没有字符串;在使用它们之前,您仍然需要将它们指向有效的位置(使用 malloc 或类似方法)。
  • Linux r-mgtswh-130 2.6.18-348.el5 #1 SMP Tue Jan 8 17:53:53 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
  • 这使用 gcc 编译。您是说这不会为您编译,还是说您在运行程序时遇到错误?
  • char ** values 是指向char 的指针,仅此而已。 values 不是“字符串”数组。
  • char *values[] = 在栈上分配数组有问题吗?

标签: c initialization


【解决方案1】:

此示例程序说明了 C 字符串数组的初始化。

#include <stdio.h>

const char * array[] = {
    "First entry",
    "Second entry",
    "Third entry",
};

#define n_array (sizeof (array) / sizeof (const char *))

int main ()
{
    int i;

    for (i = 0; i < n_array; i++) {
        printf ("%d: %s\n", i, array[i]);
    }
    return 0;
}

它打印出以下内容:

0: First entry
1: Second entry
2: Third entry

【讨论】:

  • 嗨,它有效!但我有一个问题,为什么我必须在这里使用#define n_array?我尝试过:int n_array,我的应用程序崩溃了,我是 C 新手,不理解这种行为 - #define 而不是简单的变量 int。谢谢。
  • @teMkaa 使用#define 只是风格问题;我个人不会这样做。在main 函数中,您可以轻松定义另一个int 变量并将其分配给sizeof (array) / sizeof (const char *)
【解决方案2】:

只需char **strings;char **strings = NULLchar **strings = {NULL} 即可

但要初始化它,您必须使用 malloc:

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

int main(){
    // allocate space for 5 pointers to strings
    char **strings = (char**)malloc(5*sizeof(char*));
    int i = 0;
    //allocate space for each string
    // here allocate 50 bytes, which is more than enough for the strings
    for(i = 0; i < 5; i++){
        printf("%d\n", i);
        strings[i] = (char*)malloc(50*sizeof(char));
    }
    //assign them all something
    sprintf(strings[0], "bird goes tweet");
    sprintf(strings[1], "mouse goes squeak");
    sprintf(strings[2], "cow goes moo");
    sprintf(strings[3], "frog goes croak");
    sprintf(strings[4], "what does the fox say?");
    // Print it out
    for(i = 0; i < 5; i++){
        printf("Line #%d(length: %lu): %s\n", i, strlen(strings[i]),strings[i]);
    } 
    //Free each string
    for(i = 0; i < 5; i++){
        free(strings[i]);
    }
    //finally release the first string
    free(strings);
    return 0;
}

【讨论】:

  • (我会在 malloc 之前解释一些关于类型转换的 c-grammar nazzi 评论)
  • 我猜这只是编写 C++ 并不得不这样做的习惯
  • 非常感谢。对我帮助很大。
【解决方案3】:

没有正确的方法,但你可以初始化一个字面量数组:

char **values = (char *[]){"a", "b", "c"};

或者你可以分配每个并初始化它:

char **values = malloc(sizeof(char*) * s);
for(...)
{
    values[i] = malloc(sizeof(char) * l);
    //or
    values[i] = "hello";
}

【讨论】:

  • 使用malloc() 是要走的路
  • 我在尝试编译 char **values = (char *[]){"a", "b", "c"}; 时收到编译器错误 taking address of temporary array ... char *values[] = {"a", "b", "c"}; 但是可以工作
猜你喜欢
  • 2011-12-11
  • 1970-01-01
  • 2011-05-15
  • 2015-07-25
  • 2014-08-23
  • 2011-01-05
  • 1970-01-01
  • 2021-05-10
相关资源
最近更新 更多