注意:有人建议这个问题重复Can I Compare int with size_t direct in C? ,但这里的问题特别询问如何将 size_t 与负值进行比较。因此,应该重新开放。(此外,它还引发了很多深思熟虑的讨论!)
我正在盯着一些库代码(我正在看着你,Microchip),声明返回size_t:
size_t SYS_FS_FileWrite(SYS_FS_HANDLE handle, const void *buf, size_t nbytes);
Run Code Online (Sandbox Code Playgroud)
这被记录为错误时返回 -1。但是size_t一个无符号值。那么,在理论上和/或实践中,以下行为是否允许?
if (SYS_FS_FileWrite(handle, buf, nbytes) == -1) {
report_errror();
}
Run Code Online (Sandbox Code Playgroud) size_t被声明为unsigned int不能代表负值.
那么有ssize_t哪些是签名类型的size_t权利?
这是我的问题:
#include <stdio.h>
#include <sys/types.h>
int main(){
size_t a = -25;
ssize_t b = -30;
printf("%zu\n%zu\n", a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么我得到:
18446744073709551591
18446744073709551586
Run Code Online (Sandbox Code Playgroud)
结果?
我知道size_t这可能是因为它是一个无符号类型,但为什么我得到了错误的结果ssize_t?
在我在项目中使用的源文件中,有一个ssize_t和size_t变量之间的比较:
ssize_t sst;
size_t st;
if(sst == st){...}
Run Code Online (Sandbox Code Playgroud)
我想摆脱警告:
warning: comparison between signed and unsigned integer expressions
Run Code Online (Sandbox Code Playgroud)
但我不确定,我应该向另一个转变哪个变量?
if((size_t)sst == st){...}
Run Code Online (Sandbox Code Playgroud)
要么
if(sst == (ssize_t)st){...}
Run Code Online (Sandbox Code Playgroud)
什么是更安全,更好,更清洁?谢谢
功能如strcpy(),malloc(),strlen()和各种人接受他们的观点或作为返回值size_t,而不是一个int或一个unsigned int显而易见的原因.
一些文件功能,如fread()和fwrite()使用size_t.通过扩展,可以预期char* fgets (char *str, int num, FILE *stream)应该使用a size_t而不是intas作为其缓冲区大小的参数.
但是,fgets()用一个int.有客观解释为什么?
这件事发生在我之前,但我不记得我是如何修理它的.
我无法在新的Ubuntu安装上编译一些程序......我的标题出了点问题.
我试过g ++ - 4.1和4.3无济于事.
g++ -g -frepo -DIZ_LINUX -I/usr/include/linux -I/usr/include -I/include -c qlisttest.cpp
/usr/include/libio.h:332: error: ‘size_t’ does not name a type
/usr/include/libio.h:336: error: ‘size_t’ was not declared in this scope
/usr/include/libio.h:364: error: ‘size_t’ has not been declared
/usr/include/libio.h:373: error: ‘size_t’ has not been declared
/usr/include/libio.h:493: error: ‘size_t’ does not name a type
/usr/include/stdio.h:294: error: ‘size_t’ has not been declared
...
Run Code Online (Sandbox Code Playgroud)
文件...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
...
@ubuntu:~/work/zpk/src$ cat /usr/include/linux/types.h | grep size_t
typedef __kernel_size_t …Run Code Online (Sandbox Code Playgroud) 标题实际上有点误导,但我想保持简短.我已经读过为什么我应该使用size_t,我经常发现这样的语句:
size_t保证能够表达任何对象的最大大小,包括任何数组
我真的不明白这意味着什么.是否可以一次分配多少内存,并且size_t保证足够大以计算该内存块中的每个字节?
后续问题:
什么决定了可以分配多少内存?
我将这里的代码翻译成C++,如下所示
#include <iostream>
using namespace std;
int t = 20;
bool is_evenly_divisible(const int a, const int b) {
for (int i=2; i<=b; ++i) { // Line 1
if (a%i != 0)
return false;
}
return true;
}
void run() {
int i = 10;
while (!is_evenly_divisible(i, t)) {
i += 2;
}
cout << i << endl;
}
int main(int argc, char** argv) {
run();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Mac OSX 10.8.4上使用编译器g ++ 4.8.1上的-O3标志,我得到0.568s用户时间.
现在,如果我将第1行中的计数器i在函数is_evenly_divisible中更改为size_t,则时间突然跳至1.588s.即使我将所有变量更改为size_t,这仍然存在,时间增加到1.646s
发生了什么?size_t不应该提高性能而不是降低性能,因为它比int更具体吗?
我有一个循环,必须从j到0(包括).我的j变量的类型size_t通常是无符号的.
我的代码:
#include<stdio.h>
#include<conio.h>
#define SIZE 100
int main(){
char str[SIZE];
size_t i=0;
size_t j;
puts("Enter any string");
scanf("%s",str);
while(str[i]!='\0'){
i++;
}
for(j=i-1;j>=0;j--){
printf("%c",str[j]);
}
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到一个无限循环.如果我删除零的相等性,则输出不带第一个字母的字符串的反向.那么这里的问题是什么?
在CI中,可以看到许多代码为size_t变量添加或赋予整数文字.
size_t foo = 1;
foo += 1;
Run Code Online (Sandbox Code Playgroud)
这里发生了什么转换,是否会发生a size_t被"升级"为a int然后转换回size_t?如果我在最大程度,那还会环绕吗?
size_t foo = SIZE_MAX;
foo += 1;
Run Code Online (Sandbox Code Playgroud)
这是定义的行为吗?它是一个无符号类型size_t,它int添加了一个符号(可能是一个更大的类型?)并转换回一个size_t.有签名整数溢出的风险吗?
写一些foo + bar + (size_t)1代替的东西是否有意义foo + bar + 1?我从来没有看到这样的代码,但我想知道整数促销是否有必要是否有必要.
C89没有说明size_t将如何排名或者究竟是什么:
结果的值是实现定义的,其类型(无符号整数类型)是在头中定义的size_t.
刚读过:
我发现::size_t当你使用时,使用不符合标准(虽然我的编译器支持)#include <cstddef>.我想遵守标准,但我不想在std::我size_t的所有标准之前.那么,处理这个问题的习惯/流行方式是什么:
using std::size_t;?<stddef.h>?