memset不使用指向字符的指针

时间:2016-10-11 01:57:24

标签: c++ pointers c-strings coredump memset

以下代码有什么问题? 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    
                }

            }

        });

    }

screenshot of the above program catching a segmentation fault

3 个答案:

答案 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 *namechar 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")的内容。这是不允许的。