为什么设置解除引用指针的值会引发分段错误11? 为了明确我的意思,请查看以下代码: #include int *ptr; *ptr = 2; int main(){ printf(“%d\n”, *ptr); return 0; } 我认为* ptr = 2会将指针ptr指向的rvalue设置为2.是不是这样? 对于那些c专家程序员,我很抱歉,这真的很容易/很明显。 如果该值具有内存地址,我们是否只允许将取消引用的指针(即* ptr)设置为值? 即喜欢做: int k = 7; int *ptr = k; 然后: *ptr = 2;
int i[5]={0,1,2,3,4,}; int *ip=&i[0]; printf(“%d,%d,%d,%d,%d,%d,%d,%d”,*ip,ip,&ip,&i,&i[0],i,i[0],*(&i)); 我在comp中得到的上面代码的输出是 0,2358832,2358824,2358832,2358832,2358832,0,2358832 观察到ip=&i=2358832但*ip=0且*(&i)=2358832 。 在这种情况下,一个地址如何解决2358832有两个值?
例如,请考虑以下C代码段: void *p = malloc(1); void *q = malloc(1); bool question = (uintptr_t) p == (uintptr_t) q; 我希望每个人都希望question永远是假的。 (令人惊讶的是,C11标准并不要求它。对uintptr_t的唯一限制是例如((void *) ((uintptr_t) p)) == p 。有关详细信息,请参阅C11标准的7.20.1.4。) 我的问题是:是否有任何实际用例实际上依赖于保证question是错误的,或者更一般地说,两个分配的整数表示是不同的?
程序员的输出: #include int main (){ int A[3] = {1,2,3}; printf(“%u %u %u “,&A,A,*A); return 0; } 是:3216303812 3216303812 1 这里&A和A是相同的,这意味着a的地址与a的值相同,即A指向自身。 和* A表示存储在3216303812的值,我们知道A本身就是A = A ..那么1来自哪里? 怎么来* A = 1? 请帮忙
基本上,我有一个数据矩阵(比如说int),我想存储在一个二维数组中,直到运行时才知道维度(比如x列和y行)。 我想在函数中填充数组,所以我假设我需要做这样的事情: int main(int argc, char **argv) { int y = atoi(argv[1]); int x = atoi(argv[2]); int **matrix = malloc(x * sizeof(int*)); populateMatrix(matrix, y, x); return 0; } void populateMatrix(**matrix, int y, int x) { int i, j; for (i = 0; i < y; i++) { for (j = 0; j < x; j++) […]
这是定义的行为吗? *p += *p–; 并且,如果是,它是否等于{ p[0] += p[0]; –p; } { p[0] += p[0]; –p; } { p[0] += p[0]; –p; }或{ p[-1] = p[0]; –p; } { p[-1] = p[0]; –p; } { p[-1] = p[0]; –p; } ? 我猜测是否定义取决于+=是否具有隐式序列点,如果有,我的猜测是第二个块应该是正确的。 编辑:我认为这不是建议问题的重复,因为主要问题是什么是序列点以及如何影响行为。 在我的情况下,我清楚地知道序列点是什么,问题是关于+=运算符是否具有隐式序列点。
如果“word”中的每个字母出现在“s”中,试图编写返回1的函数。 例如: containsLetters1(“this_is_a_long_string”,“gas”)返回1 containsLetters1(“this_is_a_longstring”,“gaz”)返回0 containsLetters1(“hello”,“p”)返回0 无法理解为什么不对: #include #include #define MAX_STRING 100 int containsLetters1(char *s, char *word) { int j,i, flag; long len; len=strlen(word); for (i=0; i<=len; i++) { flag=0; for (j=0; j<MAX_STRING; j++) { if (word==s) { flag=1; word++; s++; break; } s++; } if (flag==0) { break; } } return flag; } int main() […]
看起来GCC有一些优化认为来自不同翻译单元的两个指针永远不会相同,即使它们实际上是相同的。 码: main.c中 #include #include int a __attribute__((section(“test”))); extern int b; void check(int cond) { puts(cond ? “TRUE” : “FALSE”); } int main() { int * p = &a + 1; check( (p == &b) == ((uintptr_t)p == (uintptr_t)&b) ); check(p == &b); check((uintptr_t)p == (uintptr_t)&b); return 0; } 公元前 int b __attribute__((section(“test”))); 如果我用-O0编译它,它会打印出来 TRUE […]
这是我的另一个问题的延续。 请考虑以下代码: char *hi = “hello”; char *array1[3] = { hi, “world”, “there.” }; 它没有编译到我的意外(显然我不知道C语法以及我认为)并生成以下错误: error: initializer element is not constant 如果我将char *更改为char [],则编译正常: char hi[] = “hello”; char *array1[3] = { hi, “world”, “there.” }; 有人可以向我解释原因吗?
我正在编写一个与此代码类似的unit testing,我正在尝试在设置它们时测试我的值,以便我知道发生了什么。 当我运行以下代码时,我不明白为什么ptr值没有设置为1。 相反,当我运行它时,它给我一个10,64,0,0的输出。 任何解释或建议将不胜感激! #include #include typedef struct { bool bOne; bool bTwo; bool bThree; bool bFour; } items; int main() { items item; item.bOne = 0; bool *ptr = &(item.bOne); for(int i = 0; i < sizeof(items)/sizeof(bool); i++) { *ptr = 1; *ptr++; printf("ptr value = %d\n", *ptr); } return 0; }