我想使用指针和双指针读取 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::string
和 std::vector
,它会为您完成所有艰苦的工作,消除此类内存错误的可能性?
如果你edit这个问题有[c]
标签,而不是[c++]
标签,你可能会得到更好的答复。函数printf
、scanf
、malloc
、fgets
、strcpy
和free
以及 C 风格的强制转换在 C 编程语言中很常用,在 C++ 中几乎没有实际用途。
fgets(string, sizeof(string), stdin);
-- 这是不正确的,因为sizeof(string)
不是要读入的字符数。阅读sizeof
的实际作用。
提示:string
是 char*
,因此 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 个字符串,我得到一个奇怪的错误,访问违规写入位置 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章