c - 如何从调用者分配的内存空间中捕获由被调用者组织的字符串数组?

标签 c arrays string

我想将内存空间传递给被调用者以收集从文件中过滤出的字符串数组(即/tmp/saveconfig,它列在问题末尾)。 通常,它应该有以下输出,

/dev/disk/by-id/scsi-2001b4d2039784462
/dev/disk/by-id/scsi-2001b4d2049798685
/dev/disk/by-id/scsi-2001b4d2032048753

更具体地说,我假设调用者,即 main(),只需通过 char *ptr = malloc(4096) 分配一个空间并将其传递给 get_devs(),然后由调用者释放该空间。在 get_devs() 中组织字符串数组后,调用者可以使用 char *dev[] 从分配的空间中迭代字符串。 换句话说,如何将 *ptr 与 *dev[] 关联起来? 但根据下面的代码片段,我遇到了段错误。我哪里做错了?请给我一个提示。

int get_devs(char *pdev[])
{
    FILE *fp;
    char str[64];
    int len = 0, count = 0;
    char *cp, *ptr;

    /* opening file for reading */
    fp = fopen("/tmp/saveconfig", "r");
    if(fp == NULL) {
        perror("Error opening file");
        return(-1);
    }
    while(fgets(str, 64, fp) != NULL) {
        if (ptr = strstr(str, "/dev/")) {
            for (len = 1, cp = ptr; *cp != '\n'; len++, cp++) {
                if (*cp == '"') {
                    *cp = '\0';
                    break;
                }
            }
            strncpy(*pdev, ptr, len);
            printf("%s\n", pdev);
            pdev++;
            count++;
        }
    }
    fclose(fp);
    return count;   
}

int main()
{
    int i = 0, count = 0;
    char *pdev[64];

    count = get_devs(pdev);
    for (; i < sizeof(pdev) / sizeof(*pdev); i++) {
        printf("%s\n", pdev[i]);
    }
}

保存配置文件如下,

{
  "fabric_modules": [], 
  "storage_objects": [
    {
      "attributes": {
        "block_size": 512, 
      }, 
      "dev": "/dev/disk/by-id/scsi-2001b4d2039784462", 
      "name": "scsi-2001b4d2039784462", 
      "plugin": "block", 
      "readonly": false, 
      "write_back": false
    }, 
    {
      "attributes": {
        "block_size": 4096
      }, 
      "dev": "/dev/disk/by-id/scsi-2001b4d2049798685", 
      "name": "scsi-2001b4d2049798685", 
      "plugin": "block", 
      "readonly": false, 
      "write_back": false
    }, 
    {
      "attributes": {
        "block_size": 512, 
      }, 
      "dev": "/dev/disk/by-id/scsi-2001b4d2032048753", 
      "name": "scsi-2001b4d2032048753", 
      "plugin": "block", 
      "readonly": false, 
      "write_back": false
    }
  ]
}

最佳答案

许多错误,但最重要的是:

char *pdev[64];

为 64 个字符指针分配空间。但是您没有为字符本身分配任何空间,因此当您稍后使用 strncpy(*pdev, ...) 时,您将复制到随机内存中。另外,您只使用了第一个指针。您可能想做的是:

char *pdev[1000];  // How many lines in file?

int i = 0;
while (fgets(str... {
    pdev[i] = malloc(strlen(str) + 1);
    memmove(pdev[i], str, strlen(str) + 1);
    . . .
    i += 1;
    . . .

关于c - 如何从调用者分配的内存空间中捕获由被调用者组织的字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43328927/

相关文章:

c - 如何使用内核模块计算 Linux 中进程的匿名页面和共享页面

c - c程序删除字符串中重复的单词

arrays - 从数组中多次使用 SKSpriteNode(s)

python - 如何在python中更改字符串中最后一个字母的大小写?

c - 我的字符指针返回奇怪的字符串

c - greenhills 编译器关闭文件或部分文件的优化

c - printf() 的意外行为

javascript - 创建数组,根据子元素分组

javascript - 按位置从 javascript 数组中删除元素

javascript - 正则表达式 - 检查字符串是否包含一个或多个字符,但不包含某些字符