我想使用指针和双指针读取 n 个字符串,我得到一个奇怪的错误,访问违规写入位置 [关闭]

Posted

技术标签:

【中文标题】我想使用指针和双指针读取 n 个字符串,我得到一个奇怪的错误,访问违规写入位置 [关闭]【英文标题】:I want to read n strings using pointers and double pointers, and i get a wierd error, acces violation writing location [closed] 【发布时间】:2022-01-19 19:30:45 【问题描述】:

当我从用户那里读取字符串时,使用指针,我得到一个我不明白的错误 我想在字符矩阵中连续放置一个字符串,例如,如果我读到“皇家马德里”, “巴塞罗那”、“马竞”我想拥有 --第一行--“皇家马德里” --第二行 --“巴塞罗那” -- 第三行 -- “马竞”

int main() 
printf("--- The program will concatenate n strings ---\n");
printf("n = ");
int n;
scanf("%d", &n);

char** strings = (char**)malloc(n * 50 * (sizeof(char)));   //n strings 50 characters each

//reading the strings from the user
for (int i = 0; i < n; i++)

    printf("\n");
    printf("\tIntroduce the %d string : ", i);
    char* string = (char*)malloc(50 * sizeof(char));
    fgets(string, sizeof(string), stdin);

    strcpy(*(strings + i), string);      //here i get error "acces violation writing location"

    free(string);

【问题讨论】:

这看起来像 C。在 C++ 中,你会使用 std::string,除非你有充分的理由使用其他东西 如果您的意图是编写 C++ 代码,那么您应该......编写 C++ 代码,而不是具有复杂内存分配和释放逻辑的 C 代码。内存分配必须 100% 正确,并且显示的代码几乎是错误的。也许您想尝试使用 C++,搭配 std::stringstd::vector,它会为您完成所有艰苦的工作,消除此类内存错误的可能性? 如果你edit这个问题有[c]标签,而不是[c++]标签,你可能会得到更好的答复。函数printfscanfmallocfgetsstrcpyfree 以及 C 风格的强制转换在 C 编程语言中很常用,在 C++ 中几乎没有实际用途。 fgets(string, sizeof(string), stdin); -- 这是不正确的,因为sizeof(string) 不是要读入的字符数。阅读sizeof 的实际作用。 提示:stringchar*,因此 sizeof(string)sizeof(char*)。指针的大小。 【参考方案1】:

不正确:

char** strings = (char**)malloc(n * 50 * (sizeof(char)));

您的意图是让strings 成为一个指针数组(指向字符串),因此您需要为n 指针分配足够的内存:

char** strings = (char**)malloc(n * sizeof(char*));

不正确:

fgets(string, sizeof(string), stdin);

这里sizeof(string) 将是指针的大小(最有可能是4 或8),因此fgets 将无法读取长名称。相反,它应该是您分配的内存大小——即 50:

fgets(string, 50, stdin);

不正确:

strcpy(*(strings + i), string);      //here i get error "acces violation writing location"

strings 是一个未初始化的指针数组,因此当您尝试写入它们指向的内存时,您会遇到访问冲突。您已经为string 分配了内存,所以您只需复制指针即可:

strings[i] = string;

在那之后你不要想要free(string)(至少要等到以后),因为strings[i]会引用那个内存。


把它们放在一起并稍微简化一下:

char** strings = malloc(n * sizeof(char*));
for (int i = 0; i < n; i++) 
    printf("\n\tIntroduce the %d string : ", i);
    size_t maxlen = 50;
    strings[i] = malloc(maxlen);
    fgets(strings[i], maxlen, stdin);

【讨论】:

以上是关于我想使用指针和双指针读取 n 个字符串,我得到一个奇怪的错误,访问违规写入位置 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

对函数调用中的单指针和双指针参数感到困惑

第14课 单引号和双引号

有效三角形的个数--二分和双指针

链表和双指针框架

指针数组 (*A)[] 和双指针 **A 之间的区别

链表和双指针框架