int main ()
{
char *strA = "abc";
int tam_strA = strlen(strA);
char strB[tam_strA];
strB[0] = 'a';
strB[1] = 'b';
strB[2] = 'c';
strB[3] = 'd';
strB[9] = 'z';
printf("%c", strB[9]);
return 0;
}
它通常会打印“z”。为什么它不返回分段错误?因为我试图访问一个不应该存在的索引,因为strB的大小(索引数量)等于tam_strA,它等于3。
另外,做char strB[strlen(strA)];
有什么不同/问题吗?
只有在访问你不拥有的内存时,你才会出现分段错误。你拥有你的整个堆栈。strB[9]
在操作系统看来是有效的内存访问。你不应该这样做的原因是编译器不知道你在使用那个内存,所以它可能会决定将那个内存用于其他用途。这也有助于提高可读性,最大限度地减少程序员的错误。而且,标准将使用未声明的内存定义为未定义的行为,因此你不能安全地使用它。声明一个变量,如int x;
(或数组),告诉编译器您将使用x
处的内存。
这实际上与这个问题有关:为什么定义数组之外的第一个元素默认为零?。阅读那边更详细的答案。
C语言没有阻止您访问无效内存的规范,也不能保证出现分段错误。唯一的promise是,如果试图访问无效内存,将导致未定义的行为。
分割错误是可能的结果之一,而不是唯一的结果。
也就是说,唯一的问题是
char strB[strlen(strA)];
也就是说,strB
的长度不足以保存strA
中的内容,因为它缺少一个字节来保存空终止符。当然,按字节使用是可以的,但是如果您想复制内容(或与strA
相同长度的任何内容)并将strB
用作字符串,您将运行经过分配的内存(在没有空终止符的情况下),调用未定义的行为。
我是Hibernate和JPA的新手,我对这个注释有问题。有人能简单地解释一下这个注释到底在做什么吗?因为在这种情况下,文档对我来说很难理解。 编辑我明白什么是持久上下文,但在代码中,我有这样的例子: 我对@PerustenceContext做什么有问题。抱歉,也许我没有具体说明。
日安, 我有一个问题,在我的代码中,一个声明在函数之外有一个错误。 谢谢
我想写一个brainfuck口译员,但我错过了一些上下文或其他东西。应该被调用以处理“
我很困惑为什么这个方法有效…有人能给这个方法一个证明吗?
我有这两种方法。我理解“getTotalSalary”一词,但并不真正理解“getAverageSalary(获取平均工资)”的写作方式。我不明白为什么在结尾处使用问号和冒号以及“(size()!=0)”和0。 这是编码: empReg 是 ArrayList 的名称。员工是一个由“姓名”和“薪水”组成的阶级。getSalary 显然是一种返还薪水的方法。