【问题标题】:De-referencing char pointer run-time error取消引用 char 指针运行时错误
【发布时间】:2017-01-04 15:42:33
【问题描述】:

为什么下面的代码会导致运行时崩溃?

代码本身并不是很有用,但是,通过在 main 中创建一个指向 char 指针并指向字符串文字的指针,将此指针传递给我的函数并尝试读取字符串会导致问题。为什么会这样?

通过在 main 然而(注释掉)中创建一个字符串数组,传递和读取字符串没有问题。提前感谢您的知识。

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

char* GetString(char** strs, int strsSize);

char* GetString(char** strs, int strsSize)
{
    return *strs;
}

int main()
{

    char** stringArr = {"ab", "abc", "abcd"};
    //char* stringArr [] = {"ab", "abc", "abcd"};

    char* resultStr;
    resultStr = GetString(stringArr, 3);

    printf("%s\n", resultStr);

    return 0;
}

【问题讨论】:

  • 指针不是数组;数组不是指针。
  • 为什么你使用的编译器没有提供关于char** stringArr = {"ab", "abc", "abcd"};的警告?
  • 铭文。现在见他们。为什么不应该是编译器错误而不是警告?
  • 发布的代码无法编译。编译时,始终启用所有警告,然后修复这些警告。 (对于gcc,至少使用:-Wall -Wextra -pendantic 我也使用:-Wconversion -std=gnu99)警告:未使用的参数:strsSize 可以通过插入语句(void)strsSize; 来修复。并且strArray 的声明不正确。

标签: c string pointers char


【解决方案1】:

stringArr 的初始化程序无效。您有一个指向指针的指针,而不是数组。无法使用 {} 语法初始化指针。

使用-Wall -Wextra 编译时,会产生以下警告:

/tmp/x1.c: In function ‘main’:
/tmp/x1.c:15: warning: initialization from incompatible pointer type
/tmp/x1.c:15: warning: excess elements in scalar initializer
/tmp/x1.c:15: warning: (near initialization for ‘stringArr’)
/tmp/x1.c:15: warning: excess elements in scalar initializer
/tmp/x1.c:15: warning: (near initialization for ‘stringArr’)

注释掉的声明是正确的。

这两个声明都可以有效地传递给GetString,因为数组在传递给函数时会衰减为指向第一个元素的指针。但是,指针和数组不是一回事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多