c - 从函数返回的字符串数组未按预期工作

标签 c string pointers

<分区>

我正在尝试将一个字符串数组传递给一个函数,在此函数中对其进行一些更改,然后将其传递回 main() 并打印它以查看更改。它没有按预期工作。请告诉我哪里出错了。

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

//don't forget to declare this function
char** fun(char [][20]);

int main(void)
{
    char strar[10][20] = { {"abc"}, {"def"}, {"ghi"}, {""},{""} }; //make sure 10 is added
    char** ret; //no need to allocate anything for ret, ret is just a placeholder, allocation everything done in fun
    int i = 0;

    ret = fun(strar);
    for(i=0;i<4;i++)
        printf("[%s] ",ret[i]);

    printf("\n");
    return 0;
}

//don't forget function has to return char** and not int. (Remember char**, not char*)
char** fun(char strar[][20])
{
    int i = 0;
    char** ret;
    ret = malloc(sizeof(void*)); //sizeof(void*) is enough, it just has to hold an address 

    for(i=0;i<5;i++)
    {
        ret[i] = malloc(20 * sizeof(char));
        strcpy(ret[i],strar[i]);
    }

    strcpy(ret[3],"fromfun");

    return ret;
}

最佳答案

据我所知,主要问题是内存溢出。

你分配内存来保存一个元素

 ret = malloc(sizeof(void*));

但是,您要放置 5 个元素。

for(i=0;i<5;i++)
{
    ret[i] = malloc(20 * sizeof(char));....

undefined behaviour . 访问超出分配的内存。

ret 的内存分配应该是这样的

 ret = malloc(5 * sizeof(char *));

 ret = malloc(5 * sizeof*ret); //portable

详细说明所做的更改

  • 分配单个元素大小的 5 倍,因为我们要存储 5 个元素。
  • 严格来说,由于ret的类型是char **,所以我们在计算要分配的大小时需要使用char *对于 ret,不是 void *
  • 使用 sizeof *ret 的变化使代码更健壮,因为在未来,如果 ret 的类型更改为其他类型,您不会需要在此分配中重复类型更改,因为分配将取决于 *ret 的类型,无论如何。

注意:FWIW,只有在参数是数据类型的情况下才需要 sizeof 参数周围的括号,例如 sizeof(int)。在使用变量名作为参数的情况下,括号是可选的,即 sizeof(*ptr)sizeof *ptr 都是完全有效和合法的。

也就是说,

  1. 在使用返回的指针之前总是检查malloc()是否成功
  2. C 中,sizeof(char) 保证为 1。使用相同的乘数是多余的。

关于c - 从函数返回的字符串数组未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31831934/

相关文章:

c - 使用 fork 和 pipe 在数组中搜索最大值

c - 从c中的字符串中删除所有重复的字符

c - strcmp() 不比较

javascript - 使用 Javascript 查找字符串中的子字符串位置

c++ - 如何使用 c/c++ 在现代 Linux 核心转储中进行搜索?

c++ - 检测屏幕上的坐标是否可交互。

javascript - 你能为我分解这个字符串操作函数吗? (JS)

c - 递增 C 数组中的指针

c - 定义可变大小的 CHAR 指针

C 程序在程序结束时返回随机字符? (最后一个功能)