精华内容
下载资源
问答
  • 异常:写入访问权限冲突

    千次阅读 2020-12-11 17:34:42
    引发了未经处理的异常:写入访问权限冲突。 The variable ‘S’ is being used without being initialized.(使用了没有初始化的变量‘S’) 其中引发第一个问题的大部分情况可能是数组越界。遇到这个问题首先可以...

    前言

    这次朋友写代码时遇到解决不了的问题。让我帮忙看看。我觉得这个问题还挺好的,所以写下来记录一下,也算是给自己做一个笔记。

    异常

    • 引发了未经处理的异常:写入访问权限冲突。
    • The variable ‘S’ is being used without being initialized.(使用了没有初始化的变量‘S’)

    其中引发第一个问题的大部分情况可能是数组越界。遇到这个问题首先可以查看自己的代码是否有数组下标越界的情况出现。

    出问题的代码:

    int main()
    {
        stack* S;
        S->top = 0;     //报错处
    
        char a[] = "{{{{}}}}" ;
        if (Parentheses(S, a, 9))
            printf("ok");
        else
            printf("no");
        return 0;
    }
    

    stack是自己定义的一个结构体,用来模拟栈。

    错误分析 : 这里定义了一个指向一个栈的指针S,然后给S指向的栈 的top赋0 。 问题是这里有了一个指向stack的指针。但是并没有实际指向一个结构体stack。

    在这里插入图片描述
    我们假设结构体是这样的。 那么我们创建一个结构体。就需要一部分内存来保存数组p和top部分。但是我们定义一个stack *类型的S变量时,此时S里存放的应该是一个结构体的地址。但是我们的代码并没有实际存在这么一个结构体的地址。所以当我们去访问S指向的地址时,就会出现这样的错误。
    值得一提的是,这样模拟 栈 的结构体,定义的并不是很好我认为定义{ 栈顶指针 栈底指针 容量} 这样的方式会更方便理解一些。 但是为了方便讲解错误我就借用了这个代码。

    解决方法

    当我们使用指针来初始化这样的结构体,记得使用malloc函数为结构体分配内存。 修改后的代码:

    int main()
    {
        stack* S=(stack *)malloc(sizeof(stack));  //动态分配内存
        S->top = 0;   
        char a[] = "{{{{}}}}" ;
        if (Parentheses(S, a, 9))
            printf("ok");
        else
            printf("no");
        return 0;
    }
    
    展开全文
  • 引发了异常:写入访问权限冲突,L是nullptr。   原因:L是ListPtr类型,根据上述结构体定义,ListPtr属于二级指针,即指向指针(ListNodePtr)的指针。 所以分配空间时需要两步。   如下:  ...

    异常如下:

    调试时到此处中断。提示已引发异常。引发了异常:写入访问权限冲突,L是nullptr。

     

    原因:L是ListPtr类型,根据上述结构体定义,ListPtr属于二级指针,即指向指针(ListNodePtr)的指针。

    所以分配空间时需要两步。

     

    如下:

     

    展开全文
  • <code>#include<...为什么会有写入访问权限异常啊 <p style="text-align:center"><img alt="" height="512" src="https://img-ask.csdnimg.cn/upload/1615021608545.png" width="1229" /></p>  </p>
  • 引发了异常: 写入访问权限冲突。 this 是 nullptr。 程序抛异常。 前情提要: MFC程序,我自己写了一个类 MyVolt,里面有一个成员函数 CollectVolt(),字段m_hMutex 在 另一个类中定义了 MyVolt *m_volt,...

    在写代码的时候遇到了一个问题

    引发了异常: 写入访问权限冲突。
    this 是 nullptr。


    程序抛异常。

    前情提要:

    MFC程序,我自己写了一个类 MyVolt,里面有一个成员函数 CollectVolt(),字段m_hMutex

    在 另一个类中定义了 MyVolt *m_volt,调用 m_volt.CollectVolt(),执行到 m_hMutex的赋值语句时抛出上述异常。

    一开始以为是public的问题,排除不是,后来以为是作用域的问题,但是想到之前也没有遇到这种问题,暂时不考虑这个可能性。

    分析:this 是在类创建的时候的,编译器提供的参数,用来调用成员函数和变量。那么异常出现的原因和成员函数本身没有太大关系,更有可能是在定义 类对象的时候,this 是空的。

    检查发现,在定义 MyVolt *m_volt 对象的时候,只是定义了对象,没有为其分配内存空间。

    改成:MyVolt *m_volt = new MyVolt();  即可。

     

    同时进行调试也可以发现问题。

    MyVolt *m_volt;

    此时的 m_Volt 的指针是没有内存地址的,不可访问。

    MyVolt *m_volt = new MyVolt();

    此时的 m_volt 是有内存地址的。

    展开全文
  • -- Alex Juarez(作者)了解 Linux 权限以及如何控制哪些用户可以访问文件是系统管理的一项基本技能。本文将介绍标准 Linux 文件系统权限,并进一步研究特殊权限,以及使用 umask 来解释默认权限作为文章的结束。...

    06b91535bb9de60c1bff6ad23b40bb2f.png
    知道如何控制用户对文件的访问是一项基本的系统管理技能。
    -- Alex Juarez(作者)

    了解 Linux 权限以及如何控制哪些用户可以访问文件是系统管理的一项基本技能。

    本文将介绍标准 Linux 文件系统权限,并进一步研究特殊权限,以及使用 umask 来解释默认权限作为文章的结束。

    理解 ls 命令的输出

    在讨论如何修改权限之前,我们需要知道如何查看权限。通过 ls 命令的长列表参数(-l)为我们提供了有关文件的许多信息。

    $ ls -lAh
    total 20K
    -rwxr-xr--+ 1 root root    0 Mar  4 19:39 file1
    -rw-rw-rw-. 1 root root    0 Mar  4 19:39 file10
    -rwxrwxr--+ 1 root root    0 Mar  4 19:39 file2
    -rw-rw-rw-. 1 root root    0 Mar  4 19:39 file8
    -rw-rw-rw-. 1 root root    0 Mar  4 19:39 file9
    drwxrwxrwx. 2 root root 4.0K Mar  4 20:04 testdir

    为了理解这些是什么意思,让我们将关于权限的输出分解为各个部分。单独理解每个部分会更容易。

    让我们看看在上面的输出中的最后一行的每个组件:

    drwxrwxrwx. 2 root root 4.0K Mar  4 20:04 testdir

    9fbdc060c58af2f2f09b72386540171c.png

    第 1 节(左侧)显示文件的类型。

    14855a439bd53ee6681ad85be3a79d50.png

    ls 的 info 页面完整列出了不同的文件类型。

    每个文件都有三种访问方式:

    • 属主
    • 所有其他人 第 2、3 和 4 节涉及用户(属主)、组和“其他用户”权限。每个部分都可以包含 r(读取)、w(写入)和 x(执行)权限的组合。

    每个权限还分配了一个数值,这在以八进制表示形式讨论权限时很重要。

    955cfbb27ef5392435cc6022149bd41b.png

    第 5 节描述了其他替代访问方法,例如 SELinux 或文件访问控制列表(FACL)。

    d85f7d71d15c5dbe8201e3a00da7e97b.png

    第 6 节和第 7 节分别是属主和组的名称。

    使用 chown 和 chmod

    chown 命令

    chown(更改所有权)命令用于更改文件的用户和组的所有权。

    要将文件 foo 的用户和组的所有权更改为 root,我们可以使用以下命令:

    $ chown root:root foo
    $ chown root: foo

    在用户名后跟冒号(:)运行该命令将同时设置用户和组所有权。

    要仅将文件 foo 的用户所有权设置为 root 用户,请输入:

    $ chown root foo

    要仅更改文件 foo 的组所有权,请在组之前加冒号:

    $ chown :root foo

    chmod 命令

    chmod(更改模式)命令控制属主、组以及既不是属主也不属于与文件关联的组的所有其他用户的文件许可权。

    chmod 命令可以以八进制(例如 755644 等)和符号(例如 u+rwxg-rwxo=rw)格式设置权限。

    八进制表示法将 4 个“点”分配给“读取”,将 2 个“点”分配给“写入”,将 1 个点分配给“执行”。如果要给用户(属主)分配“读取”权限,则将 4 分配给第一个插槽,但是如果要添加“写入”权限,则必须添加 2。如果要添加“执行”,则要添加 1。我们对每种权限类型执行此操作:属主、组和其他。

    例如,如果我们想将“读取”、“写入”和“执行”分配给文件的属主,但仅将“读取”和“执行”分配给组成员和所有其他用户,则我们应使用 755(八进制格式)。这是属主的所有权限位(4+2+1),但组和其他权限的所有权限位只有 414+1)。

    细分为:4+2+1=7,4+1=5 和 4+1=5。

    如果我们想将“读取”和“写入”分配给文件的属主,而只将“读取”分配给组的成员和所有其他用户,则可以如下使用 chmod

    $ chmod 644 foo_file

    在下面的示例中,我们在不同的分组中使用符号表示法。注意字母 ugo 分别代表“用户”(属主)、“组”和“其他”。我们将 ugo+-= 结合使用来添加、删除或设置权限位。

    要将“执行”位添加到所有权权限集中:

    $ chmod u+x foo_file

    要从组成员中删除“读取”、“写入”和“执行”:

    $ chmod g-rwx foo_file

    要将所有其他用户的所有权设置为“读取”和“写入”:

    $ chmod o=rw

    特殊位:设置 UID、设置 GID 和粘滞位

    除了标准权限外,还有一些特殊的权限位,它们具有一些别的用处。

    设置用户 ID(suid)

    当在文件上设置 suid 时,将以文件的属主的身份而不是运行该文件的用户身份执行操作。一个好的例子是 passwd 命令。它需要设置 suid 位,以便更改密码的操作具有 root 权限。

    $ ls -l /bin/passwd
    -rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd

    设置 suid 位的示例:

    $ chmod u+s /bin/foo_file_name

    设置组 ID(sgid)

    sgid 位与 suid 位类似,操作是在目录的组所有权下完成的,而不是以运行命令的用户身份。

    一个使用 sgid 的例子是,如果多个用户正在同一个目录中工作,并且目录中创建的每个文件都需要具有相同的组权限。下面的示例创建一个名为 collab_dir 的目录,设置 sgid 位,并将组所有权更改为 webdev

    $ mkdir collab_dir
    $ chmod g+s collab_dir
    $ chown :webdev collab_dir

    现在,在该目录中创建的任何文件都将具有 webdev 的组所有权,而不是创建该文件的用户的组。

    $ cd collab_dir
    $ touch file-sgid
    $ ls -lah file-sgid
    -rw-r--r--. 1 root webdev 0 Jun 12 06:04 file-sgid

    “粘滞”位

    粘滞位表示,只有文件所有者才能删除该文件,即使组权限允许该文件可以删除。通常,在 /tmp 这样的通用或协作目录上,此设置最有意义。在下面的示例中,“所有其他人”权限集的“执行”列中的 t 表示已应用粘滞位。

    $ ls -ld /tmp
    drwxrwxrwt. 8 root root 4096 Jun 12 06:07 /tmp/

    请记住,这不会阻止某个人编辑该文件,它只是阻止他们删除该目录的内容(LCTT 译注:即删除目录下文件)。

    我们将粘滞位设置为:

    $ chmod o+t foo_dir

    你可以自己尝试在目录上设置粘滞位并赋予其完整的组权限,以便多个属于同一组的用户可以在目录上进行读取、写入和执行。

    接着,以每个用户的身份创建文件,然后尝试以另一个用户的身份删除它们。

    如果一切配置正确,则一个用户应该不能从另一用户那里删除文件。

    请注意,这些位中的每个位也可以用八进制格式设置:SUID = 4、SGID = 2 和 粘滞位 = 1。(LCTT 译注:这里是四位八进制数字)

    $ chmod 4744
    $ chmod 2644
    $ chmod 1755

    大写还是小写?

    如果要设置特殊位时看到大写的 ST 而不是小写的字符(如我们之前所见),那是因为不存在(对应的)底层的执行位。为了说明这一点,下面的示例创建一个设置了粘滞位的文件。然后,我们可以添加和删除执行位以演示大小写更改。

    $ touch file cap-ST-demo
    $ chmod 1755 cap-ST-demo
    $ ls -l cap-ST-demo
    -rwxr-xr-t. 1 root root 0 Jun 12 06:16 cap-ST-demo
    
    $ chmod o-x cap-X-demo
    $ ls -l cap-X-demo
    -rwxr-xr-T. 1 root root 0 Jun 12 06:16 cap-ST-demo

    有条件地设置执行位

    至此,我们使用小写的 x 设置了执行位,而无需询问任何问题即可对其进行设置。我们还有另一种选择:使用大写的 X 而不是小写的,它将仅在权限组中某个位置已经有执行位时才设置执行位。这可能是一个很难解释的概念,但是下面的演示将帮助说明它。请注意,在尝试将执行位添加到组特权之后,该位没有被设置上。

    $ touch cap-X-file
    $ ls -l cap-X-file
    -rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
    $ chmod g+X cap-X-file
    $ ls -l cap-X-file
    -rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file

    在这个类似的例子中,我们首先使用小写的 x 将执行位添加到组权限,然后使用大写的 X 为所有其他用户添加权限。这次,大写的 X设置了该权限。

    $ touch cap-X-file
    $ ls -l cap-X-file
    -rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
    $ chmod g+x cap-X-file
    $ ls -l cap-X-file
    -rw-r-xr--. 1 root root 0 Jun 12 06:31 cap-X-file
    $ chmod o+X cap-X-file
    ls -l cap-X-file
    -rw-r-xr-x. 1 root root 0 Jun 12 06:31 cap-X-file

    理解 umask

    umask 会屏蔽(或“阻止”)默认权限集中的位,以定义文件或目录的权限。例如,umask输出中的 2 表示它至少在默认情况下阻止了文件的“写入”位。

    使用不带任何参数的 umask 命令可以使我们看到当前的 umask 设置。共有四列:第一列为特殊的suidsgid 或粘滞位而保留,其余三列代表属主、组和其他人的权限。

    $ umask
    0022

    为了理解这意味着什么,我们可以用 -S 标志来执行 umask(如下所示)以解释屏蔽位的结果。例如,由于第三列中的值为 2,因此将“写入”位从组和其他部分中屏蔽掉了;只能为它们分配“读取”和“执行”。

    $ umask -S
    u=rwx,g=rx,o=rx

    要查看文件和目录的默认权限集是什么,让我们将 umask 设置为全零。这意味着我们在创建文件时不会掩盖任何位。

    $ umask 000
    $ umask -S
    u=rwx,g=rwx,o=rwx
    
    $ touch file-umask-000
    $ ls -l file-umask-000
    -rw-rw-rw-. 1 root root 0 Jul 17 22:03 file-umask-000

    现在,当我们创建文件时,我们看到所有部分的默认权限分别为“读取”(4)和“写入”(2),相当于八进制表示 666

    我们可以对目录执行相同的操作,并看到其默认权限为 777。我们需要在目录上使用“执行”位,以便可以遍历它们。

    $ mkdir dir-umask-000
    $ ls -ld dir-umask-000
    drwxrwxrwx. 2 root root 4096 Jul 17 22:03 dir-umask-000/

    总结

    管理员还有许多其他方法可以控制对系统文件的访问。这些权限是 Linux 的基本权限,我们可以在这些基础上进行构建。如果你的工作为你引入了 FACL 或 SELinux,你会发现它们也建立在这些文件访问的首要规则之上。


    展开全文
  • //引发了异常: 写入访问权限冲突。 **this** 是 nullptr。 strcpy(name, n); sex = s; bir.setbir(b); add.setadd(a); strcpy(telephone, t); } friends input(friends& bb)//为对象bb输出数据 ...
  • (给Linux爱好者加星标,提升Linux技能)编译:linux中国-lujun9972,作者:Sandra Henry-Stockerhttps://linux.cn/article-10947-1.htm在 Linux 上查看文件权限时,有时你会看到的不仅仅是普通的 r、w、x 和-。...
  • 显示T是nullptr 麻烦大神们帮我看看,十分感谢 #include "stdafx.h" #include <windows.h> #include <stdio.h> #include <malloc.h> typedef int Status; typedef int ElemType;...
  • 当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。CPU访问内存时需要的是地址,而不是变量名或...
  • VS2017环境下,C语言使用malloc()创建动态数组,引发了异常: 写入访问权限冲突。 string 是 0xFFFFFFFFB212A360。 测试代码如下: #include<stdio.h> int main(void) { const int str_max_size = 1024; ...
  • 问题截图,明明已经通过InitializeQueue初始化了pq—>rear,不知道为什么。 <p><img alt="" height="597" src=...   完整代码段 ...<code>#ifndef _QUEUE_H_ ... </p>
  • 删除无关代码后,代码如下 struct NODE { int data ; int next ; } ; class myAllocator ; class myBuffer { private: friend myAllocator ; NODE *mBuffer ; int mLength ;...}
  • 我想写一个关于学生信息的程序,封闭一个学生类,可是当我运行的时候,刚一录入学生姓名,按了回车后就程序已停止运行,调试 的时候与写入访问权限冲突了。这是怎么回事,研究了好几天,毫无头绪。。。[img=...
  • 题目要求将链表逆置,输入-1结束。 代码: #define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode* next;...
  • 1.一般是初始化了参数,却没有给参数空间, 查找问题,看构造里是否初始化,初始化的时候是否给了空间。 特别是单例模式中,初始化一定要给空间。
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • ![图片说明](https://img-ask.csdn.net/upload/201611/10/1478786235_460948.png) ![图片说明](https://img-ask.csdn.net/upload/201611/10/1478786292_797332.png) 如图,小白一个死乞白赖的求大神解答
  • ![图片说明]... debug的时候就会转到这个界面,请问这个界面是什么意思,我查了下是调用堆栈,但是怎么才能这个在这个里面错误对应源代码的哪一行?
  • 今天我和0xCCCCCCCC杠上了,连着遇到了两次关于0xCCCCCCCC的错误。...因此,未初始化时候的指针是指向地址0x0cccccccc的,而这段地址一来是处于内核地址空间,一般的应用程序是无权访问的,如果遇到该种报错...
  • 但是链表也有缺点、极限,比如它不擅长删除、获取、访问指定序号的元素,换言之,快速访问链表中的任意节点(数据项)是它的短板。每一次的操作,都需要从头(头结点)进行变量,知道链表的尾节点的指针域为空为止...
  • 第一篇将探讨初始化和访问元素相关板块,咱们带着疑问去学习,例如:初始化的时候会马上分配内存吗?底层数据是如何存储的?底层是如何使用 key 去寻找数据的?底层是用什么方式解决哈希冲突的?数据类型那么多,...
  • [img=https://img-bbs.csdn.net/upload/201707/05/1499264036_198212.png][/img]
  • 这里写自定 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的...
  • 这是因为C语言仅有单一的“名字空间”,并且名称开始发生冲突,引发额外的管理开销。而对于Java,关键字package、包的命名模式和关键字import,可以使你对名称进行完全的控制,因名称的问题是很容易避免的。本章讨论...
  • <code class="language-cpp">//Rational.h #pragma once #include<iostream> class Rational { public: friend std::istream &operator>>(std::istream &input, Rational &... </p>
  • C 指针学习 C 语言的指针既简单又有趣。通过指针,可以简化一些 C 编程任务的执行,还有...)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:实例当上面的代码被编译和...
  • #include #include #include //动态分布数组存放Huffman树 typedef struct { ...引发了未经处理的异常:写入访问权限冲突。 p 是 0xCDDDCDEE。 不知所措额。 救救孩子吧 谢谢谢谢!感激不尽

空空如也

空空如也

1 2 3 4 5
收藏数 90
精华内容 36
关键字:

写入访问权限冲突