以下代码有什么问题? memset应该与Pointer一起使用,以填充内存块。但是此代码在控制台中显示分段错误(核心转储)
的问题function getAllMediaIDs(function() {
// Send results
});
function getAllMediaIDs(callback) {
ig.user_self_media_recent(options, function(err, medias, pagination, remaining, limit) {
if (err) {
// Error
}
else {
for (var i = 0; i < medias.length; i++) {
getLikes(medias[i].id);
}
callback();
}
});
}
function getLikes(mediaId) {
ig.likes(mediaId, function(err, result, remaining, limit) {
if (err) {
// Error
}
else {
for (var i = 0; i < result.length; i++) {
// Store likes
}
}
});
}
答案 0 :(得分:7)
你已经绊倒了C ++中一个非常古老的向后兼容的疣,继承自C并且可以追溯到 没有const
之类的日子。字符串文字的类型为const char [n]
,但是,除非您告诉编译器您不需要与1990年之前的代码兼容,否则它将默默地允许您设置char *
变量以指向它们。但它赢了允许你通过这样的指针写。实际内存(尽可能)标记为只读; &#34;分段错误&#34;您观察到的错误是操作系统报告尝试写入只读内存的方式。
就语言规范而言,通过非const
指针写入const
数据 - 但是你设法将其设置为 - 具有&#34;未定义的行为&#34;,这是一种奇特的说法&#34;程序不正确,但编译器不必发出诊断,如果你得到一个已编译的可执行文件,它可能会任何。&# 34; A&#34;分段错误&#34;几乎总是意味着你的程序在某个地方有不确定的行为。
如果我使用适当的设置编译您的程序,我会收到错误:
$ g++ -std=gnu++11 -Wall -Werror test.cc
test.cc: In function ‘int main(int, char**)’:
test.cc:7:19: error: ISO C++ forbids converting a string constant to ‘char*’
[-Werror=write-strings]
char* name = "SAMPLE TEXT";
^~~~~~~~~~~~~
在获得足够的技能以了解何时更适合不同的设置之前,请使用-std=gnu++11 -Wall -Werror
编译所有您的C ++程序,或者编译器的等效内容。 (您似乎使用的是Unix风格的操作系统,因此这些设置应该有效。您可能还需要-g
和/或-O
。)
通过将程序更改为
,可以使您的程序正常工作#include <iostream>
#include <cstring>
int
main()
{
char name[] = "SAMPLE TEXT";
std::memset(name, '*', 6);
std::cout << name << '\n';
return 0;
}
=&GT;
$ g++ -std=c++11 -Wall -Werror test.cc
$ ./a.out
****** TEXT
修复错误的更改是从char *name
到char name[]
;我也改变了其他一些东西,但只是为了表现出更好的风格。这样做是强制编译器在进入main
时将字符串文字复制到可写内存。 为什么这样做需要很长时间来解释;咨询一本好的C ++教科书。
答案 1 :(得分:3)
自2011年以来,这不是有效的C ++代码,并且曾经有过UB。它是C中的UB。
C ++≥11:您无法将字符串文字分配给非const
char
指针。
C ++≥98和C:你不能覆盖字符串文字。
将您的代码更改为
char name[] = "SAMPLE TEXT";
并且您将拥有一个可以覆盖的本地数组。
答案 2 :(得分:0)
代码尝试修改字符串文字("SAMPLE TEXT"
)的内容。这是不允许的。